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 }