github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/worker/uniter/runner/context/export_test.go (about)

     1  // Copyright 2012-2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package context
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"github.com/juju/utils/clock"
     9  	"github.com/juju/utils/proxy"
    10  	"gopkg.in/juju/charm.v6-unstable"
    11  	"gopkg.in/juju/names.v2"
    12  
    13  	"github.com/juju/juju/api/uniter"
    14  	"github.com/juju/juju/apiserver/params"
    15  	"github.com/juju/juju/core/leadership"
    16  	"github.com/juju/juju/worker/uniter/runner/jujuc"
    17  )
    18  
    19  var (
    20  	ValidatePortRange = validatePortRange
    21  	TryOpenPorts      = tryOpenPorts
    22  	TryClosePorts     = tryClosePorts
    23  )
    24  
    25  func NewHookContext(
    26  	unit *uniter.Unit,
    27  	state *uniter.State,
    28  	id,
    29  	uuid,
    30  	envName string,
    31  	relationId int,
    32  	remoteUnitName string,
    33  	relations map[int]*ContextRelation,
    34  	apiAddrs []string,
    35  	proxySettings proxy.Settings,
    36  	canAddMetrics bool,
    37  	charmMetrics *charm.Metrics,
    38  	actionData *ActionData,
    39  	assignedMachineTag names.MachineTag,
    40  	paths Paths,
    41  	clock clock.Clock,
    42  ) (*HookContext, error) {
    43  	ctx := &HookContext{
    44  		unit:               unit,
    45  		state:              state,
    46  		id:                 id,
    47  		uuid:               uuid,
    48  		envName:            envName,
    49  		unitName:           unit.Name(),
    50  		relationId:         relationId,
    51  		remoteUnitName:     remoteUnitName,
    52  		relations:          relations,
    53  		apiAddrs:           apiAddrs,
    54  		proxySettings:      proxySettings,
    55  		actionData:         actionData,
    56  		pendingPorts:       make(map[PortRange]PortRangeInfo),
    57  		assignedMachineTag: assignedMachineTag,
    58  		clock:              clock,
    59  	}
    60  	// Get and cache the addresses.
    61  	var err error
    62  	ctx.publicAddress, err = unit.PublicAddress()
    63  	if err != nil && !params.IsCodeNoAddressSet(err) {
    64  		return nil, err
    65  	}
    66  	ctx.privateAddress, err = unit.PrivateAddress()
    67  	if err != nil && !params.IsCodeNoAddressSet(err) {
    68  		return nil, err
    69  	}
    70  	ctx.availabilityzone, err = unit.AvailabilityZone()
    71  	if err != nil {
    72  		return nil, err
    73  	}
    74  	ctx.machinePorts, err = state.AllMachinePorts(ctx.assignedMachineTag)
    75  	if err != nil {
    76  		return nil, errors.Trace(err)
    77  	}
    78  
    79  	statusCode, statusInfo, err := unit.MeterStatus()
    80  	if err != nil {
    81  		return nil, errors.Annotate(err, "could not retrieve meter status for unit")
    82  	}
    83  	ctx.meterStatus = &meterStatus{
    84  		code: statusCode,
    85  		info: statusInfo,
    86  	}
    87  	return ctx, nil
    88  }
    89  
    90  // SetEnvironmentHookContextRelation exists purely to set the fields used in hookVars.
    91  // It makes no assumptions about the validity of context.
    92  func SetEnvironmentHookContextRelation(
    93  	context *HookContext,
    94  	relationId int, endpointName, remoteUnitName string,
    95  ) {
    96  	context.relationId = relationId
    97  	context.remoteUnitName = remoteUnitName
    98  	context.relations = map[int]*ContextRelation{
    99  		relationId: {
   100  			endpointName: endpointName,
   101  			relationId:   relationId,
   102  		},
   103  	}
   104  }
   105  
   106  func PatchCachedStatus(ctx jujuc.Context, status, info string, data map[string]interface{}) func() {
   107  	hctx := ctx.(*HookContext)
   108  	oldStatus := hctx.status
   109  	hctx.status = &jujuc.StatusInfo{
   110  		Status: status,
   111  		Info:   info,
   112  		Data:   data,
   113  	}
   114  	return func() {
   115  		hctx.status = oldStatus
   116  	}
   117  }
   118  
   119  func GetStubActionContext(in map[string]interface{}) *HookContext {
   120  	return &HookContext{
   121  		actionData: &ActionData{
   122  			ResultsMap: in,
   123  		},
   124  	}
   125  }
   126  
   127  type LeadershipContextFunc func(LeadershipSettingsAccessor, leadership.Tracker) LeadershipContext
   128  
   129  func PatchNewLeadershipContext(f LeadershipContextFunc) func() {
   130  	var old LeadershipContextFunc
   131  	old, newLeadershipContext = newLeadershipContext, f
   132  	return func() { newLeadershipContext = old }
   133  }
   134  
   135  func StorageAddConstraints(ctx *HookContext) map[string][]params.StorageConstraints {
   136  	return ctx.storageAddConstraints
   137  }
   138  
   139  // NewModelHookContext exists purely to set the fields used in rs.
   140  // The returned value is not otherwise valid.
   141  func NewModelHookContext(
   142  	id, modelUUID, envName, unitName, meterCode, meterInfo, availZone string,
   143  	apiAddresses []string, proxySettings proxy.Settings,
   144  	machineTag names.MachineTag,
   145  ) *HookContext {
   146  	return &HookContext{
   147  		id:            id,
   148  		unitName:      unitName,
   149  		uuid:          modelUUID,
   150  		envName:       envName,
   151  		apiAddrs:      apiAddresses,
   152  		proxySettings: proxySettings,
   153  		meterStatus: &meterStatus{
   154  			code: meterCode,
   155  			info: meterInfo,
   156  		},
   157  		relationId:         -1,
   158  		assignedMachineTag: machineTag,
   159  		availabilityzone:   availZone,
   160  	}
   161  }
   162  
   163  func ContextEnvInfo(hctx *HookContext) (name, uuid string) {
   164  	return hctx.envName, hctx.uuid
   165  }
   166  
   167  func ContextMachineTag(hctx *HookContext) names.MachineTag {
   168  	return hctx.assignedMachineTag
   169  }
   170  
   171  func UpdateCachedSettings(cf0 ContextFactory, relId int, unitName string, settings params.Settings) {
   172  	cf := cf0.(*contextFactory)
   173  	members := cf.relationCaches[relId].members
   174  	if members[unitName] == nil {
   175  		members[unitName] = params.Settings{}
   176  	}
   177  	for key, value := range settings {
   178  		members[unitName][key] = value
   179  	}
   180  }
   181  
   182  func CachedSettings(cf0 ContextFactory, relId int, unitName string) (params.Settings, bool) {
   183  	cf := cf0.(*contextFactory)
   184  	settings, found := cf.relationCaches[relId].members[unitName]
   185  	return settings, found
   186  }