github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/apiserver/uniter/uniter_v2.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 // The uniter package implements the API interface used by the uniter 5 // worker. This file contains the API facade version 2. 6 7 package uniter 8 9 import ( 10 "github.com/juju/loggo" 11 "github.com/juju/names" 12 13 "github.com/juju/juju/apiserver/common" 14 "github.com/juju/juju/apiserver/params" 15 "github.com/juju/juju/state" 16 ) 17 18 var logger = loggo.GetLogger("juju.apiserver.uniter") 19 20 func init() { 21 common.RegisterStandardFacade("Uniter", 2, NewUniterAPIV2) 22 } 23 24 // UniterAPI implements the API version 2, used by the uniter worker. 25 type UniterAPIV2 struct { 26 UniterAPIV1 27 StorageAPI 28 } 29 30 // AddMetricBatches adds the metrics for the specified unit. 31 func (u *UniterAPIV2) AddMetricBatches(args params.MetricBatchParams) (params.ErrorResults, error) { 32 result := params.ErrorResults{ 33 Results: make([]params.ErrorResult, len(args.Batches)), 34 } 35 canAccess, err := u.accessUnit() 36 if err != nil { 37 logger.Warningf("failed to check unit access: %v", err) 38 return params.ErrorResults{}, common.ErrPerm 39 } 40 for i, batch := range args.Batches { 41 tag, err := names.ParseUnitTag(batch.Tag) 42 if err != nil { 43 result.Results[i].Error = common.ServerError(err) 44 continue 45 } 46 if !canAccess(tag) { 47 result.Results[i].Error = common.ServerError(common.ErrPerm) 48 continue 49 } 50 metrics := make([]state.Metric, len(batch.Batch.Metrics)) 51 for j, metric := range batch.Batch.Metrics { 52 metrics[j] = state.Metric{ 53 Key: metric.Key, 54 Value: metric.Value, 55 Time: metric.Time, 56 } 57 } 58 _, err = u.UniterAPIV1.st.AddMetrics(state.BatchParam{ 59 UUID: batch.Batch.UUID, 60 Created: batch.Batch.Created, 61 CharmURL: batch.Batch.CharmURL, 62 Metrics: metrics, 63 Unit: tag, 64 }) 65 result.Results[i].Error = common.ServerError(err) 66 } 67 return result, nil 68 } 69 70 // NewUniterAPIV2 creates a new instance of the Uniter API, version 2. 71 func NewUniterAPIV2(st *state.State, resources *common.Resources, authorizer common.Authorizer) (*UniterAPIV2, error) { 72 baseAPI, err := NewUniterAPIV1(st, resources, authorizer) 73 if err != nil { 74 return nil, err 75 } 76 storageAPI, err := newStorageAPI(getStorageState(st), resources, baseAPI.accessUnit) 77 if err != nil { 78 return nil, err 79 } 80 return &UniterAPIV2{ 81 UniterAPIV1: *baseAPI, 82 StorageAPI: *storageAPI, 83 }, nil 84 }