github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/environs/tools/urls_test.go (about) 1 // Copyright 2012, 2013, 2014 Canonical Ltd. 2 // Copyright 2014 Cloudbase Solutions SRL 3 // Licensed under the AGPLv3, see LICENCE file for details. 4 5 package tools_test 6 7 import ( 8 "fmt" 9 10 "github.com/juju/errors" 11 jc "github.com/juju/testing/checkers" 12 gc "gopkg.in/check.v1" 13 14 "github.com/juju/juju/environs" 15 "github.com/juju/juju/environs/bootstrap" 16 "github.com/juju/juju/environs/simplestreams" 17 sstesting "github.com/juju/juju/environs/simplestreams/testing" 18 envtesting "github.com/juju/juju/environs/testing" 19 "github.com/juju/juju/environs/tools" 20 "github.com/juju/juju/juju/keys" 21 "github.com/juju/juju/jujuclient" 22 "github.com/juju/juju/provider/dummy" 23 coretesting "github.com/juju/juju/testing" 24 ) 25 26 type URLsSuite struct { 27 coretesting.BaseSuite 28 } 29 30 var _ = gc.Suite(&URLsSuite{}) 31 32 func (s *URLsSuite) TearDownTest(c *gc.C) { 33 dummy.Reset(c) 34 35 s.BaseSuite.TearDownTest(c) 36 } 37 38 func (s *URLsSuite) env(c *gc.C, toolsMetadataURL string) environs.Environ { 39 attrs := dummy.SampleConfig() 40 if toolsMetadataURL != "" { 41 attrs = attrs.Merge(coretesting.Attrs{ 42 "agent-metadata-url": toolsMetadataURL, 43 }) 44 } 45 env, err := bootstrap.PrepareController(false, envtesting.BootstrapTODOContext(c), 46 jujuclient.NewMemStore(), 47 bootstrap.PrepareParams{ 48 ControllerConfig: coretesting.FakeControllerConfig(), 49 ControllerName: attrs["name"].(string), 50 ModelConfig: attrs, 51 Cloud: dummy.SampleCloudSpec(), 52 AdminSecret: "admin-secret", 53 }, 54 ) 55 c.Assert(err, jc.ErrorIsNil) 56 return env.(environs.Environ) 57 } 58 59 func (s *URLsSuite) TestToolsURLsNoConfigURL(c *gc.C) { 60 ss := simplestreams.NewSimpleStreams(sstesting.TestDataSourceFactory()) 61 env := s.env(c, "") 62 sources, err := tools.GetMetadataSources(env, ss) 63 c.Assert(err, jc.ErrorIsNil) 64 sstesting.AssertExpectedSources(c, sources, []sstesting.SourceDetails{{"https://streams.canonical.com/juju/tools/", keys.JujuPublicKey, true}}) 65 } 66 67 func (s *URLsSuite) TestToolsSources(c *gc.C) { 68 ss := simplestreams.NewSimpleStreams(sstesting.TestDataSourceFactory()) 69 env := s.env(c, "config-tools-metadata-url") 70 sources, err := tools.GetMetadataSources(env, ss) 71 c.Assert(err, jc.ErrorIsNil) 72 sstesting.AssertExpectedSources(c, sources, []sstesting.SourceDetails{ 73 {"config-tools-metadata-url/", keys.JujuPublicKey, false}, 74 {"https://streams.canonical.com/juju/tools/", keys.JujuPublicKey, true}, 75 }) 76 } 77 78 func (s *URLsSuite) TestToolsMetadataURLsRegisteredFuncs(c *gc.C) { 79 ss := simplestreams.NewSimpleStreams(sstesting.TestDataSourceFactory()) 80 tools.RegisterToolsDataSourceFunc("id0", func(environs.Environ) (simplestreams.DataSource, error) { 81 return ss.NewDataSource(simplestreams.Config{ 82 Description: "id0", 83 BaseURL: "betwixt/releases", 84 HostnameVerification: false, 85 Priority: simplestreams.DEFAULT_CLOUD_DATA}), nil 86 }) 87 tools.RegisterToolsDataSourceFunc("id1", func(environs.Environ) (simplestreams.DataSource, error) { 88 return ss.NewDataSource(simplestreams.Config{ 89 Description: "id1", 90 BaseURL: "yoink", 91 HostnameVerification: false, 92 Priority: simplestreams.SPECIFIC_CLOUD_DATA}), nil 93 }) 94 // overwrite the one previously registered against id1 95 tools.RegisterToolsDataSourceFunc("id1", func(environs.Environ) (simplestreams.DataSource, error) { 96 // NotSupported errors do not cause GetMetadataSources to fail, 97 // they just cause the datasource function to be ignored. 98 return nil, errors.NewNotSupported(nil, "oyvey") 99 }) 100 defer tools.UnregisterToolsDataSourceFunc("id0") 101 defer tools.UnregisterToolsDataSourceFunc("id1") 102 103 env := s.env(c, "config-tools-metadata-url") 104 sources, err := tools.GetMetadataSources(env, ss) 105 c.Assert(err, jc.ErrorIsNil) 106 sstesting.AssertExpectedSources(c, sources, []sstesting.SourceDetails{ 107 {"config-tools-metadata-url/", keys.JujuPublicKey, false}, 108 {"betwixt/releases/", "", false}, 109 {"https://streams.canonical.com/juju/tools/", keys.JujuPublicKey, true}, 110 }) 111 } 112 113 func (s *URLsSuite) TestToolsMetadataURLsRegisteredFuncsError(c *gc.C) { 114 ss := simplestreams.NewSimpleStreams(sstesting.TestDataSourceFactory()) 115 tools.RegisterToolsDataSourceFunc("id0", func(environs.Environ) (simplestreams.DataSource, error) { 116 // Non-NotSupported errors cause GetMetadataSources to fail. 117 return nil, errors.New("oyvey!") 118 }) 119 defer tools.UnregisterToolsDataSourceFunc("id0") 120 121 env := s.env(c, "config-tools-metadata-url") 122 _, err := tools.GetMetadataSources(env, ss) 123 c.Assert(err, gc.ErrorMatches, "oyvey!") 124 } 125 126 func (s *URLsSuite) TestToolsURL(c *gc.C) { 127 var toolsTests = []struct { 128 in string 129 expected string 130 expectedErr error 131 }{{ 132 in: "", 133 expected: "", 134 expectedErr: nil, 135 }, { 136 in: "file://foo", 137 expected: "file://foo", 138 expectedErr: nil, 139 }, { 140 in: "http://foo", 141 expected: "http://foo", 142 expectedErr: nil, 143 }, { 144 in: "foo", 145 expected: "", 146 expectedErr: fmt.Errorf("foo is not an absolute path"), 147 }, { 148 in: "/home/foo", 149 expected: "file:///home/foo/tools", 150 expectedErr: nil, 151 }, { 152 in: "/home/foo/tools", 153 expected: "file:///home/foo/tools", 154 expectedErr: nil, 155 }} 156 157 for i, t := range toolsTests { 158 c.Logf("Test %d:", i) 159 160 out, err := tools.ToolsURL(t.in) 161 c.Assert(err, gc.DeepEquals, t.expectedErr) 162 c.Assert(out, gc.Equals, t.expected) 163 } 164 }