github.com/mhilton/juju-juju@v0.0.0-20150901100907-a94dd2c73455/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.unit.AddMetrics(batch.Batch.UUID, batch.Batch.Created, batch.Batch.CharmURL, metrics) 59 result.Results[i].Error = common.ServerError(err) 60 } 61 return result, nil 62 } 63 64 // NewUniterAPIV2 creates a new instance of the Uniter API, version 2. 65 func NewUniterAPIV2(st *state.State, resources *common.Resources, authorizer common.Authorizer) (*UniterAPIV2, error) { 66 baseAPI, err := NewUniterAPIV1(st, resources, authorizer) 67 if err != nil { 68 return nil, err 69 } 70 storageAPI, err := newStorageAPI(getStorageState(st), resources, baseAPI.accessUnit) 71 if err != nil { 72 return nil, err 73 } 74 return &UniterAPIV2{ 75 UniterAPIV1: *baseAPI, 76 StorageAPI: *storageAPI, 77 }, nil 78 }