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  }