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  }