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  }