github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/jujuclient/modelsfile_test.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package jujuclient_test 5 6 import ( 7 "os" 8 9 jc "github.com/juju/testing/checkers" 10 gc "gopkg.in/check.v1" 11 12 "github.com/juju/juju/core/model" 13 "github.com/juju/juju/feature" 14 "github.com/juju/juju/juju/osenv" 15 "github.com/juju/juju/jujuclient" 16 "github.com/juju/juju/testing" 17 ) 18 19 type ModelsFileSuite struct { 20 testing.FakeJujuXDGDataHomeSuite 21 } 22 23 var _ = gc.Suite(&ModelsFileSuite{}) 24 25 const testModelsYAML = ` 26 controllers: 27 ctrl: 28 models: 29 admin/admin: 30 uuid: ghi 31 type: iaas 32 branch: master 33 kontroll: 34 models: 35 admin/admin: 36 uuid: abc 37 type: iaas 38 branch: master 39 admin/my-model: 40 uuid: def 41 type: iaas 42 branch: master 43 current-model: admin/my-model 44 ` 45 46 const testLegacyModelsYAML = ` 47 controllers: 48 ctrl: 49 models: 50 admin@local/admin: 51 uuid: ghi 52 kontroll: 53 models: 54 admin@local/admin: 55 uuid: abc 56 admin@local/my-model: 57 uuid: def 58 current-model: admin@local/my-model 59 ` 60 61 var testControllerModels = map[string]*jujuclient.ControllerModels{ 62 "kontroll": { 63 Models: map[string]jujuclient.ModelDetails{ 64 "admin/admin": kontrollAdminModelDetails, 65 "admin/my-model": kontrollMyModelModelDetails, 66 }, 67 CurrentModel: "admin/my-model", 68 }, 69 "ctrl": { 70 Models: map[string]jujuclient.ModelDetails{ 71 "admin/admin": ctrlAdminModelDetails, 72 }, 73 }, 74 } 75 76 var kontrollAdminModelDetails = jujuclient.ModelDetails{ 77 ModelUUID: "abc", 78 ModelType: model.IAAS, 79 ActiveBranch: model.GenerationMaster, 80 } 81 var kontrollMyModelModelDetails = jujuclient.ModelDetails{ 82 ModelUUID: "def", 83 ModelType: model.IAAS, 84 ActiveBranch: model.GenerationMaster, 85 } 86 var ctrlAdminModelDetails = jujuclient.ModelDetails{ 87 ModelUUID: "ghi", 88 ModelType: model.IAAS, 89 ActiveBranch: model.GenerationMaster, 90 } 91 92 func (s *ModelsFileSuite) TestWriteFile(c *gc.C) { 93 writeTestModelsFile(c) 94 data, err := os.ReadFile(osenv.JujuXDGDataHomePath("models.yaml")) 95 c.Assert(err, jc.ErrorIsNil) 96 c.Assert(string(data), gc.Equals, testModelsYAML[1:]) 97 } 98 99 func (s *ModelsFileSuite) TestReadNoFile(c *gc.C) { 100 models, err := jujuclient.ReadModelsFile("nowhere.yaml") 101 c.Assert(err, jc.ErrorIsNil) 102 c.Assert(models, gc.IsNil) 103 } 104 105 func (s *ModelsFileSuite) TestReadEmptyFile(c *gc.C) { 106 err := os.WriteFile(osenv.JujuXDGDataHomePath("models.yaml"), []byte(""), 0600) 107 c.Assert(err, jc.ErrorIsNil) 108 models, err := jujuclient.ReadModelsFile(jujuclient.JujuModelsPath()) 109 c.Assert(err, jc.ErrorIsNil) 110 c.Assert(models, gc.HasLen, 0) 111 } 112 113 func (s *ModelsFileSuite) TestMigrateLegacyLocal(c *gc.C) { 114 s.SetFeatureFlags(feature.Branches) 115 err := os.WriteFile(jujuclient.JujuModelsPath(), []byte(testLegacyModelsYAML), 0644) 116 c.Assert(err, jc.ErrorIsNil) 117 118 models, err := jujuclient.ReadModelsFile(jujuclient.JujuModelsPath()) 119 c.Assert(err, jc.ErrorIsNil) 120 121 migratedData, err := os.ReadFile(jujuclient.JujuModelsPath()) 122 c.Assert(err, jc.ErrorIsNil) 123 migratedModels, err := jujuclient.ParseModels(migratedData) 124 c.Assert(err, jc.ErrorIsNil) 125 c.Assert(string(migratedData), jc.DeepEquals, testModelsYAML[1:]) 126 c.Assert(migratedModels, jc.DeepEquals, models) 127 } 128 129 func writeTestModelsFile(c *gc.C) { 130 err := jujuclient.WriteModelsFile(testControllerModels) 131 c.Assert(err, jc.ErrorIsNil) 132 } 133 134 func (s *ModelsFileSuite) TestParseModels(c *gc.C) { 135 models, err := jujuclient.ParseModels([]byte(testModelsYAML)) 136 c.Assert(err, jc.ErrorIsNil) 137 c.Assert(models, jc.DeepEquals, testControllerModels) 138 } 139 140 func (s *ModelsFileSuite) TestParseModelMetadataError(c *gc.C) { 141 models, err := jujuclient.ParseModels([]byte("fail me now")) 142 c.Assert(err, gc.ErrorMatches, 143 "cannot unmarshal models: yaml: unmarshal errors:"+ 144 "\n line 1: cannot unmarshal !!str `fail me...` into "+ 145 "jujuclient.modelsCollection", 146 ) 147 c.Assert(models, gc.IsNil) 148 }