本文整理汇总了Golang中github.com/juju/juju/agent.Agent类的典型用法代码示例。如果您正苦于以下问题:Golang Agent类的具体用法?Golang Agent怎么用?Golang Agent使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了Agent类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: start
// start is a method on ManifoldConfig because it's more readable than a closure.
func (config ManifoldConfig) start(getResource dependency.GetResourceFunc) (worker.Worker, error) {
var clock clock.Clock
if err := getResource(config.ClockName, &clock); err != nil {
return nil, errors.Trace(err)
}
var apiCaller base.APICaller
if err := getResource(config.APICallerName, &apiCaller); err != nil {
return nil, errors.Trace(err)
}
var agent agent.Agent
if err := getResource(config.AgentName, &agent); err != nil {
return nil, errors.Trace(err)
}
agentTag := agent.CurrentConfig().Tag()
machineTag, ok := agentTag.(names.MachineTag)
if !ok {
return nil, errors.New("singular flag expected a machine agent")
}
// TODO(fwereade): model id is implicit in apiCaller, would
// be better if explicit.
facade, err := config.NewFacade(apiCaller, machineTag)
if err != nil {
return nil, errors.Trace(err)
}
flag, err := config.NewWorker(FlagConfig{
Clock: clock,
Facade: facade,
Duration: config.Duration,
})
if err != nil {
return nil, errors.Trace(err)
}
return flag, nil
}
示例2: newWorker
// newWorker trivially wraps NewWorker for use in a engine.AgentAPIManifold.
func newWorker(a agent.Agent, apiCaller base.APICaller) (worker.Worker, error) {
cfg := a.CurrentConfig()
// Grab the tag and ensure that it's for a machine.
tag, ok := cfg.Tag().(names.MachineTag)
if !ok {
return nil, errors.New("this manifold may only be used inside a machine agent")
}
// Get the machine agent's jobs.
entity, err := apiagent.NewState(apiCaller).Entity(tag)
if err != nil {
return nil, err
}
var isModelManager bool
for _, job := range entity.Jobs() {
if job == multiwatcher.JobManageModel {
isModelManager = true
break
}
}
if !isModelManager {
return nil, dependency.ErrMissing
}
return NewWorker(cfg)
}
示例3: newWorker
func newWorker(a agent.Agent, apiCaller base.APICaller) (worker.Worker, error) {
cfg := a.CurrentConfig()
// Grab the tag and ensure that it's for a machine.
tag, ok := cfg.Tag().(names.MachineTag)
if !ok {
return nil, errors.New("this manifold may only be used inside a machine agent")
}
// Get the machine agent's jobs.
// TODO(fwereade): this functionality should be on the
// deployer facade instead.
agentFacade := apiagent.NewState(apiCaller)
entity, err := agentFacade.Entity(tag)
if err != nil {
return nil, err
}
var isModelManager bool
for _, job := range entity.Jobs() {
if job == multiwatcher.JobManageModel {
isModelManager = true
break
}
}
if !isModelManager {
return nil, dependency.ErrMissing
}
return NewResumer(apiresumer.NewAPI(apiCaller)), nil
}
示例4: NewLock
// NewLock creates a gate.Lock to be used to synchronise workers which
// need to start after upgrades have completed. If no upgrade steps
// are required the Lock is unlocked and the version in agent's
// configuration is updated to the currently running version.
//
// The returned Lock should be passed to NewWorker.
func NewLock(a agent.Agent) (gate.Lock, error) {
lock := gate.NewLock()
if wrench.IsActive("machine-agent", "always-try-upgrade") {
// Always enter upgrade mode. This allows test of upgrades
// even when there's actually no upgrade steps to run.
return lock, nil
}
err := a.ChangeConfig(func(agentConfig agent.ConfigSetter) error {
if !upgrades.AreUpgradesDefined(agentConfig.UpgradedToVersion()) {
logger.Infof("no upgrade steps required or upgrade steps for %v "+
"have already been run.", jujuversion.Current)
lock.Unlock()
// Even if no upgrade is required the version number in
// the agent's config still needs to be bumped.
agentConfig.SetUpgradedToVersion(jujuversion.Current)
}
return nil
})
if err != nil {
return nil, err
}
return lock, nil
}
示例5: Manifold
// Manifold returns a dependency.Manifold which wraps the machine
// agent's voyeur.Value which gets set whenever it the machine agent's
// config is changed. Whenever the config is updated the presence of
// state serving info is checked and if state serving info was added
// or removed the manifold worker will bounce itself.
//
// The manifold offes a single boolean output which will be true if
// state serving info is available (i.e. the machine agent should be a
// state server) and false otherwise.
//
// This manifold is intended to be used as a dependency for the state
// manifold.
func Manifold(config ManifoldConfig) dependency.Manifold {
return dependency.Manifold{
Inputs: []string{config.AgentName},
Start: func(getResource dependency.GetResourceFunc) (worker.Worker, error) {
var a agent.Agent
if err := getResource(config.AgentName, &a); err != nil {
return nil, err
}
if config.AgentConfigChanged == nil {
return nil, errors.NotValidf("nil AgentConfigChanged")
}
if _, ok := a.CurrentConfig().Tag().(names.MachineTag); !ok {
return nil, errors.New("manifold can only be used with a machine agent")
}
w := &stateConfigWatcher{
agent: a,
agentConfigChanged: config.AgentConfigChanged,
}
go func() {
defer w.tomb.Done()
w.tomb.Kill(w.loop())
}()
return w, nil
},
Output: outputFunc,
}
}
示例6: startFunc
// startFunc returns a StartFunc that creates a worker based on the manifolds
// named in the supplied config.
func startFunc(config ManifoldConfig) dependency.StartFunc {
return func(getResource dependency.GetResourceFunc) (worker.Worker, error) {
// Get dependencies and open a connection.
var a agent.Agent
if err := getResource(config.AgentName, &a); err != nil {
return nil, err
}
conn, err := openConnection(a)
if err != nil {
return nil, errors.Annotate(err, "cannot open api")
}
// Add the environment uuid to agent config if not present.
currentConfig := a.CurrentConfig()
if currentConfig.Environment().Id() == "" {
err := a.ChangeConfig(func(setter agent.ConfigSetter) error {
environTag, err := conn.EnvironTag()
if err != nil {
return errors.Annotate(err, "no environment uuid set on api")
}
return setter.Migrate(agent.MigrateParams{
Environment: environTag,
})
})
if err != nil {
logger.Warningf("unable to save environment uuid: %v", err)
// Not really fatal, just annoying.
}
}
// Return the worker.
return newApiConnWorker(conn)
}
}
示例7: newWorker
func newWorker(a agent.Agent, apiCaller base.APICaller) (worker.Worker, error) {
w, err := NewWorker(keyupdater.NewState(apiCaller), a.CurrentConfig())
if err != nil {
return nil, errors.Annotate(err, "cannot start ssh auth-keys updater worker")
}
return w, nil
}
示例8: Manifold
// Manifold returns a dependency manifold that runs an upgrader
// worker, using the resource names defined in the supplied config.
func Manifold(config ManifoldConfig) dependency.Manifold {
inputs := []string{
config.AgentName,
config.APICallerName,
}
// The machine agent uses these but the unit agent doesn't.
if config.UpgradeStepsGateName != "" {
inputs = append(inputs, config.UpgradeStepsGateName)
}
if config.UpgradeCheckGateName != "" {
inputs = append(inputs, config.UpgradeCheckGateName)
}
return dependency.Manifold{
Inputs: inputs,
Start: func(context dependency.Context) (worker.Worker, error) {
var agent agent.Agent
if err := context.Get(config.AgentName, &agent); err != nil {
return nil, err
}
currentConfig := agent.CurrentConfig()
var apiCaller base.APICaller
if err := context.Get(config.APICallerName, &apiCaller); err != nil {
return nil, err
}
upgraderFacade := upgrader.NewState(apiCaller)
var upgradeStepsWaiter gate.Waiter
if config.UpgradeStepsGateName == "" {
upgradeStepsWaiter = gate.NewLock()
} else {
if config.PreviousAgentVersion == version.Zero {
return nil, errors.New("previous agent version not specified")
}
if err := context.Get(config.UpgradeStepsGateName, &upgradeStepsWaiter); err != nil {
return nil, err
}
}
var initialCheckUnlocker gate.Unlocker
if config.UpgradeCheckGateName == "" {
initialCheckUnlocker = gate.NewLock()
} else {
if err := context.Get(config.UpgradeCheckGateName, &initialCheckUnlocker); err != nil {
return nil, err
}
}
return NewAgentUpgrader(
upgraderFacade,
currentConfig,
config.PreviousAgentVersion,
upgradeStepsWaiter,
initialCheckUnlocker,
)
},
}
}
示例9: newWorker
func (config MachineManifoldConfig) newWorker(a agent.Agent, apiCaller base.APICaller) (worker.Worker, error) {
if config.Clock == nil {
return nil, dependency.ErrMissing
}
cfg := a.CurrentConfig()
api, err := storageprovisioner.NewState(apiCaller, cfg.Tag())
if err != nil {
return nil, errors.Trace(err)
}
tag, ok := cfg.Tag().(names.MachineTag)
if !ok {
return nil, errors.Errorf("this manifold may only be used inside a machine agent")
}
storageDir := filepath.Join(cfg.DataDir(), "storage")
w, err := NewStorageProvisioner(Config{
Scope: tag,
StorageDir: storageDir,
Volumes: api,
Filesystems: api,
Life: api,
Registry: provider.CommonStorageProviders(),
Machines: api,
Status: api,
Clock: config.Clock,
})
if err != nil {
return nil, errors.Trace(err)
}
return w, nil
}
示例10: Manifold
// Manifold returns a dependency manifold that runs a uniter worker,
// using the resource names defined in the supplied config.
func Manifold(config ManifoldConfig) dependency.Manifold {
return dependency.Manifold{
Inputs: []string{
config.AgentName,
config.APICallerName,
config.LeadershipTrackerName,
config.MachineLockName,
config.CharmDirName,
},
Start: func(getResource dependency.GetResourceFunc) (worker.Worker, error) {
// Collect all required resources.
var agent agent.Agent
if err := getResource(config.AgentName, &agent); err != nil {
return nil, err
}
var apiCaller base.APICaller
if err := getResource(config.APICallerName, &apiCaller); err != nil {
// TODO(fwereade): absence of an APICaller shouldn't be the end of
// the world -- we ought to return a type that can at least run the
// leader-deposed hook -- but that's not done yet.
return nil, err
}
var machineLock *fslock.Lock
if err := getResource(config.MachineLockName, &machineLock); err != nil {
return nil, err
}
var leadershipTracker leadership.Tracker
if err := getResource(config.LeadershipTrackerName, &leadershipTracker); err != nil {
return nil, err
}
var charmDirGuard fortress.Guard
if err := getResource(config.CharmDirName, &charmDirGuard); err != nil {
return nil, err
}
// Configure and start the uniter.
config := agent.CurrentConfig()
tag := config.Tag()
unitTag, ok := tag.(names.UnitTag)
if !ok {
return nil, errors.Errorf("expected a unit tag, got %v", tag)
}
uniterFacade := uniter.NewState(apiCaller, unitTag)
return NewUniter(&UniterParams{
UniterFacade: uniterFacade,
UnitTag: unitTag,
LeadershipTracker: leadershipTracker,
DataDir: config.DataDir(),
MachineLock: machineLock,
CharmDirGuard: charmDirGuard,
UpdateStatusSignal: NewUpdateStatusTimer(),
NewOperationExecutor: operation.NewExecutor,
Clock: clock.WallClock,
}), nil
},
}
}
示例11: getAPIAddresses
func getAPIAddresses(a agent.Agent) []string {
config := a.CurrentConfig()
addrs, err := config.APIAddresses()
if err != nil {
logger.Errorf("retrieving API addresses: %s", err)
addrs = nil
}
sort.Strings(addrs)
return addrs
}
示例12: uninstallerManifold
// uninstallerManifold defines a simple start function which retrieves
// some dependencies, checks if the machine is dead and causes the
// agent to uninstall itself if it is. This doubles up on part of the
// machiner's functionality but the machiner doesn't run until
// upgrades are complete, and the upgrade related workers may not be
// able to make API requests if the machine is dead.
func uninstallerManifold(config uninstallerManifoldConfig) dependency.Manifold {
return dependency.Manifold{
Inputs: []string{
config.AgentName,
config.APICallerName,
},
Start: func(getResource dependency.GetResourceFunc) (worker.Worker, error) {
if config.WriteUninstallFile == nil {
return nil, errors.New("WriteUninstallFile not specified")
}
// Get the agent.
var agent agent.Agent
if err := getResource(config.AgentName, &agent); err != nil {
return nil, err
}
// Grab the tag and ensure that it's for a machine.
tag, ok := agent.CurrentConfig().Tag().(names.MachineTag)
if !ok {
return nil, errors.New("agent's tag is not a machine tag")
}
// Get API connection.
//
// TODO(mjs) - this should really be a base.APICaller to
// remove the possibility of the API connection being closed
// here.
var apiConn api.Connection
if err := getResource(config.APICallerName, &apiConn); err != nil {
return nil, err
}
// Check if the machine is dead and set the agent to
// uninstall if it is.
//
// TODO(mjs) - ideally this would be using its own facade.
machine, err := apiConn.Agent().Entity(tag)
if err != nil {
return nil, err
}
if machine.Life() == params.Dead {
if err := config.WriteUninstallFile(); err != nil {
return nil, errors.Annotate(err, "writing uninstall agent file")
}
return nil, worker.ErrTerminateAgent
}
// All is well - we're done (no actual worker is actually returned).
return nil, dependency.ErrUninstall
},
}
}
示例13: start
// start is used by util.AgentApiManifold to create a StartFunc.
func (config ManifoldConfig) start(a agent.Agent, apiCaller base.APICaller) (worker.Worker, error) {
machineTag, ok := a.CurrentConfig().Tag().(names.MachineTag)
if !ok {
return nil, errors.Errorf("this manifold can only be used inside a machine")
}
machineActionsFacade := config.NewFacade(apiCaller)
return config.NewWorker(WorkerConfig{
Facade: machineActionsFacade,
MachineTag: machineTag,
HandleAction: HandleAction,
})
}
示例14: ServingInfoSetterManifold
// ServingInfoSetterManifold defines a simple start function which
// runs after the API connection has come up. If the machine agent is
// a controller, it grabs the state serving info over the API and
// records it to agent configuration, and then stops.
func ServingInfoSetterManifold(config ServingInfoSetterConfig) dependency.Manifold {
return dependency.Manifold{
Inputs: []string{
config.AgentName,
config.APICallerName,
},
Start: func(context dependency.Context) (worker.Worker, error) {
// Get the agent.
var agent coreagent.Agent
if err := context.Get(config.AgentName, &agent); err != nil {
return nil, err
}
// Grab the tag and ensure that it's for a machine.
tag, ok := agent.CurrentConfig().Tag().(names.MachineTag)
if !ok {
return nil, errors.New("agent's tag is not a machine tag")
}
// Get API connection.
var apiCaller base.APICaller
if err := context.Get(config.APICallerName, &apiCaller); err != nil {
return nil, err
}
apiState := apiagent.NewState(apiCaller)
// If the machine needs State, grab the state serving info
// over the API and write it to the agent configuration.
machine, err := apiState.Entity(tag)
if err != nil {
return nil, err
}
for _, job := range machine.Jobs() {
if job.NeedsState() {
info, err := apiState.StateServingInfo()
if err != nil {
return nil, errors.Errorf("cannot get state serving info: %v", err)
}
err = agent.ChangeConfig(func(config coreagent.ConfigSetter) error {
config.SetStateServingInfo(info)
return nil
})
if err != nil {
return nil, err
}
}
}
// All is well - we're done (no actual worker is actually returned).
return nil, dependency.ErrUninstall
},
}
}
示例15: OnlyConnect
// OnlyConnect logs into the API using the supplied agent's credentials.
func OnlyConnect(a agent.Agent, apiOpen api.OpenFunc) (api.Connection, error) {
agentConfig := a.CurrentConfig()
info, ok := agentConfig.APIInfo()
if !ok {
return nil, errors.New("API info not available")
}
conn, _, err := connectFallback(apiOpen, info, agentConfig.OldPassword())
if err != nil {
return nil, errors.Trace(err)
}
return conn, nil
}