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  }