github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/apiserver/facades/controller/migrationmaster/shim.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package migrationmaster
     5  
     6  import (
     7  	"github.com/juju/collections/set"
     8  	"github.com/juju/errors"
     9  	"github.com/juju/names/v5"
    10  	"github.com/juju/version/v2"
    11  
    12  	"github.com/juju/juju/state"
    13  )
    14  
    15  // backend wraps a *state.State to implement Backend.
    16  // It is untested, but is simple enough to be verified by inspection.
    17  type backend struct {
    18  	*state.State
    19  }
    20  
    21  func newBacked(st *state.State) Backend {
    22  	return &backend{State: st}
    23  }
    24  
    25  // ModelName implements Backend.
    26  func (s *backend) ModelName() (string, error) {
    27  	model, err := s.Model()
    28  	if err != nil {
    29  		return "", errors.Trace(err)
    30  	}
    31  	return model.Name(), nil
    32  }
    33  
    34  // ModelOwner implements Backend.
    35  func (s *backend) ModelOwner() (names.UserTag, error) {
    36  	model, err := s.Model()
    37  	if err != nil {
    38  		return names.UserTag{}, errors.Trace(err)
    39  	}
    40  	return model.Owner(), nil
    41  }
    42  
    43  // AgentVersion implements Backend.
    44  func (s *backend) AgentVersion() (version.Number, error) {
    45  	m, err := s.Model()
    46  	if err != nil {
    47  		return version.Zero, errors.Trace(err)
    48  	}
    49  
    50  	cfg, err := m.ModelConfig()
    51  	if err != nil {
    52  		return version.Zero, errors.Trace(err)
    53  	}
    54  	vers, ok := cfg.AgentVersion()
    55  	if !ok {
    56  		return version.Zero, errors.New("no agent version")
    57  	}
    58  	return vers, nil
    59  }
    60  
    61  // AllLocalRelatedModels returns all models on this controller to which
    62  // another hosted model has a consuming cross model relation.
    63  func (s *backend) AllLocalRelatedModels() ([]string, error) {
    64  	uuids, err := s.AllModelUUIDs()
    65  	if err != nil {
    66  		return nil, errors.Trace(err)
    67  	}
    68  	localUUIDs := set.NewStrings(uuids...)
    69  	apps, err := s.AllRemoteApplications()
    70  	if err != nil {
    71  		return nil, errors.Trace(err)
    72  	}
    73  	var crossModelUUIDs []string
    74  	for _, app := range apps {
    75  		if app.IsConsumerProxy() {
    76  			continue
    77  		}
    78  		if localUUIDs.Contains(app.SourceModel().Id()) {
    79  			crossModelUUIDs = append(crossModelUUIDs, app.SourceModel().Id())
    80  		}
    81  	}
    82  	return crossModelUUIDs, nil
    83  }