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  }