github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/worker/apiaddressupdater/manifold.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package apiaddressupdater
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"github.com/juju/names/v5"
     9  	"github.com/juju/worker/v3"
    10  	"github.com/juju/worker/v3/dependency"
    11  
    12  	"github.com/juju/juju/agent"
    13  	"github.com/juju/juju/api/agent/caasoperator"
    14  	"github.com/juju/juju/api/agent/machiner"
    15  	"github.com/juju/juju/api/agent/uniter"
    16  	"github.com/juju/juju/api/base"
    17  	"github.com/juju/juju/cmd/jujud/agent/engine"
    18  )
    19  
    20  // Logger represents the methods used for logging messages.
    21  type Logger interface {
    22  	Errorf(string, ...interface{})
    23  	Infof(string, ...interface{})
    24  	Debugf(string, ...interface{})
    25  	Warningf(string, ...interface{})
    26  }
    27  
    28  // ManifoldConfig defines the names of the manifolds on which a Manifold will depend.
    29  type ManifoldConfig struct {
    30  	AgentName     string
    31  	APICallerName string
    32  	Logger        Logger
    33  }
    34  
    35  // Manifold returns a dependency manifold that runs an API address updater worker,
    36  // using the resource names defined in the supplied config.
    37  func Manifold(config ManifoldConfig) dependency.Manifold {
    38  	typedConfig := engine.AgentAPIManifoldConfig{
    39  		AgentName:     config.AgentName,
    40  		APICallerName: config.APICallerName,
    41  	}
    42  	return engine.AgentAPIManifold(typedConfig, config.newWorker)
    43  }
    44  
    45  // newWorker trivially wraps NewAPIAddressUpdater for use in a engine.AgentAPIManifold.
    46  // It's not tested at the moment, because the scaffolding necessary is too
    47  // unwieldy/distracting to introduce at this point.
    48  func (config ManifoldConfig) newWorker(a agent.Agent, apiCaller base.APICaller) (worker.Worker, error) {
    49  	tag := a.CurrentConfig().Tag()
    50  
    51  	// TODO(fwereade): use appropriate facade!
    52  	var facade APIAddresser
    53  	switch apiTag := tag.(type) {
    54  	case names.UnitTag:
    55  		facade = uniter.NewState(apiCaller, apiTag)
    56  	case names.ApplicationTag:
    57  		facade = caasoperator.NewClient(apiCaller)
    58  	case names.MachineTag:
    59  		facade = machiner.NewState(apiCaller)
    60  	default:
    61  		return nil, errors.Errorf("expected a unit or machine tag; got %q", tag)
    62  	}
    63  
    64  	setter := agent.APIHostPortsSetter{Agent: a}
    65  	w, err := NewAPIAddressUpdater(Config{
    66  		Addresser: facade,
    67  		Setter:    setter,
    68  		Logger:    config.Logger,
    69  	})
    70  	if err != nil {
    71  		return nil, errors.Trace(err)
    72  	}
    73  	return w, nil
    74  }