github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/state/testing/conn.go (about) 1 // Copyright 2014 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package testing 5 6 import ( 7 "time" 8 9 "github.com/juju/clock" 10 mgotesting "github.com/juju/mgo/v3/testing" 11 "github.com/juju/names/v5" 12 jc "github.com/juju/testing/checkers" 13 gc "gopkg.in/check.v1" 14 15 "github.com/juju/juju/cloud" 16 "github.com/juju/juju/environs/config" 17 "github.com/juju/juju/mongo" 18 "github.com/juju/juju/state" 19 "github.com/juju/juju/storage" 20 "github.com/juju/juju/storage/provider" 21 dummystorage "github.com/juju/juju/storage/provider/dummy" 22 "github.com/juju/juju/testing" 23 ) 24 25 type InitializeArgs struct { 26 Owner names.UserTag 27 AdminPassword string 28 InitialConfig *config.Config 29 ControllerConfig map[string]interface{} 30 ControllerInheritedConfig map[string]interface{} 31 ControllerModelType state.ModelType 32 RegionConfig cloud.RegionConfig 33 NewPolicy state.NewPolicyFunc 34 Clock clock.Clock 35 } 36 37 // Initialize initializes the state and returns it. If state was not 38 // already initialized, and cfg is nil, the minimal default model 39 // configuration will be used. 40 // This provides for tests still using a real clock from utils as tests are 41 // migrated to use the testing clock 42 func Initialize(c *gc.C, owner names.UserTag, cfg *config.Config, controllerInheritedConfig map[string]interface{}, regionConfig cloud.RegionConfig, newPolicy state.NewPolicyFunc) *state.Controller { 43 return InitializeWithArgs(c, InitializeArgs{ 44 Owner: owner, 45 InitialConfig: cfg, 46 ControllerInheritedConfig: controllerInheritedConfig, 47 RegionConfig: regionConfig, 48 NewPolicy: newPolicy, 49 Clock: &clock.WallClock, 50 }) 51 } 52 53 // InitializeWithArgs initializes the state and returns it. If state was not 54 // already initialized, and args.Config is nil, the minimal default model 55 // configuration will be used. 56 func InitializeWithArgs(c *gc.C, args InitializeArgs) *state.Controller { 57 if args.InitialConfig == nil { 58 args.InitialConfig = testing.ModelConfig(c) 59 } 60 if args.AdminPassword == "" { 61 args.AdminPassword = "admin-secret" 62 } 63 64 session, err := mgotesting.MgoServer.Dial() 65 c.Assert(err, jc.ErrorIsNil) 66 defer session.Close() 67 68 controllerCfg := testing.FakeControllerConfig() 69 for k, v := range args.ControllerConfig { 70 controllerCfg[k] = v 71 } 72 73 modelType := state.ModelTypeIAAS 74 if args.ControllerModelType != "" { 75 modelType = args.ControllerModelType 76 } 77 78 ctlr, err := state.Initialize(state.InitializeParams{ 79 Clock: args.Clock, 80 ControllerConfig: controllerCfg, 81 ControllerModelArgs: state.ModelArgs{ 82 Type: modelType, 83 CloudName: "dummy", 84 CloudRegion: "dummy-region", 85 Config: args.InitialConfig, 86 Owner: args.Owner, 87 StorageProviderRegistry: storage.ChainedProviderRegistry{ 88 dummystorage.StorageProviders(), 89 provider.CommonStorageProviders(), 90 }, 91 }, 92 ControllerInheritedConfig: args.ControllerInheritedConfig, 93 Cloud: cloud.Cloud{ 94 Name: "dummy", 95 Type: "dummy", 96 AuthTypes: []cloud.AuthType{cloud.EmptyAuthType}, 97 Regions: []cloud.Region{ 98 { 99 Name: "dummy-region", 100 Endpoint: "dummy-endpoint", 101 IdentityEndpoint: "dummy-identity-endpoint", 102 StorageEndpoint: "dummy-storage-endpoint", 103 }, 104 { 105 Name: "nether-region", 106 Endpoint: "nether-endpoint", 107 IdentityEndpoint: "nether-identity-endpoint", 108 StorageEndpoint: "nether-storage-endpoint", 109 }, 110 { 111 Name: "unused-region", 112 Endpoint: "unused-endpoint", 113 IdentityEndpoint: "unused-identity-endpoint", 114 StorageEndpoint: "unused-storage-endpoint", 115 }, 116 { 117 Name: "dotty.region", 118 Endpoint: "dotty.endpoint", 119 IdentityEndpoint: "dotty.identity-endpoint", 120 StorageEndpoint: "dotty.storage-endpoint", 121 }, 122 }, 123 RegionConfig: args.RegionConfig, 124 }, 125 MongoSession: session, 126 WatcherPollInterval: 10 * time.Millisecond, 127 NewPolicy: args.NewPolicy, 128 AdminPassword: args.AdminPassword, 129 }) 130 c.Assert(err, jc.ErrorIsNil) 131 return ctlr 132 } 133 134 // NewMongoInfo returns information suitable for 135 // connecting to the testing controller's mongo database. 136 func NewMongoInfo() *mongo.MongoInfo { 137 return &mongo.MongoInfo{ 138 Info: mongo.Info{ 139 Addrs: []string{mgotesting.MgoServer.Addr()}, 140 CACert: testing.CACert, 141 DisableTLS: !mgotesting.MgoServer.SSLEnabled(), 142 }, 143 } 144 }