github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/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  	"github.com/juju/utils"
    13  	gc "gopkg.in/check.v1"
    14  
    15  	"github.com/juju/juju/environs"
    16  	"github.com/juju/juju/environs/bootstrap"
    17  	"github.com/juju/juju/environs/simplestreams"
    18  	sstesting "github.com/juju/juju/environs/simplestreams/testing"
    19  	envtesting "github.com/juju/juju/environs/testing"
    20  	"github.com/juju/juju/environs/tools"
    21  	"github.com/juju/juju/juju/keys"
    22  	"github.com/juju/juju/jujuclient/jujuclienttesting"
    23  	"github.com/juju/juju/provider/dummy"
    24  	"github.com/juju/juju/testing"
    25  	coretesting "github.com/juju/juju/testing"
    26  )
    27  
    28  type URLsSuite struct {
    29  	coretesting.BaseSuite
    30  }
    31  
    32  var _ = gc.Suite(&URLsSuite{})
    33  
    34  func (s *URLsSuite) TearDownTest(c *gc.C) {
    35  	dummy.Reset(c)
    36  
    37  	s.BaseSuite.TearDownTest(c)
    38  }
    39  
    40  func (s *URLsSuite) env(c *gc.C, toolsMetadataURL string) environs.Environ {
    41  	attrs := dummy.SampleConfig()
    42  	if toolsMetadataURL != "" {
    43  		attrs = attrs.Merge(testing.Attrs{
    44  			"agent-metadata-url": toolsMetadataURL,
    45  		})
    46  	}
    47  	env, err := bootstrap.Prepare(envtesting.BootstrapContext(c),
    48  		jujuclienttesting.NewMemStore(),
    49  		bootstrap.PrepareParams{
    50  			ControllerConfig: coretesting.FakeControllerConfig(),
    51  			ControllerName:   attrs["name"].(string),
    52  			ModelConfig:      attrs,
    53  			Cloud:            dummy.SampleCloudSpec(),
    54  			AdminSecret:      "admin-secret",
    55  		},
    56  	)
    57  	c.Assert(err, jc.ErrorIsNil)
    58  	return env
    59  }
    60  
    61  func (s *URLsSuite) TestToolsURLsNoConfigURL(c *gc.C) {
    62  	env := s.env(c, "")
    63  	sources, err := tools.GetMetadataSources(env)
    64  	c.Assert(err, jc.ErrorIsNil)
    65  	sstesting.AssertExpectedSources(c, sources, []sstesting.SourceDetails{{"https://streams.canonical.com/juju/tools/", keys.JujuPublicKey}})
    66  }
    67  
    68  func (s *URLsSuite) TestToolsSources(c *gc.C) {
    69  	env := s.env(c, "config-tools-metadata-url")
    70  	sources, err := tools.GetMetadataSources(env)
    71  	c.Assert(err, jc.ErrorIsNil)
    72  	sstesting.AssertExpectedSources(c, sources, []sstesting.SourceDetails{
    73  		{"config-tools-metadata-url/", keys.JujuPublicKey},
    74  		{"https://streams.canonical.com/juju/tools/", keys.JujuPublicKey},
    75  	})
    76  }
    77  
    78  func (s *URLsSuite) TestToolsMetadataURLsRegisteredFuncs(c *gc.C) {
    79  	tools.RegisterToolsDataSourceFunc("id0", func(environs.Environ) (simplestreams.DataSource, error) {
    80  		return simplestreams.NewURLDataSource("id0", "betwixt/releases", utils.NoVerifySSLHostnames, simplestreams.DEFAULT_CLOUD_DATA, false), nil
    81  	})
    82  	tools.RegisterToolsDataSourceFunc("id1", func(environs.Environ) (simplestreams.DataSource, error) {
    83  		return simplestreams.NewURLDataSource("id1", "yoink", utils.NoVerifySSLHostnames, simplestreams.SPECIFIC_CLOUD_DATA, false), nil
    84  	})
    85  	// overwrite the one previously registered against id1
    86  	tools.RegisterToolsDataSourceFunc("id1", func(environs.Environ) (simplestreams.DataSource, error) {
    87  		// NotSupported errors do not cause GetMetadataSources to fail,
    88  		// they just cause the datasource function to be ignored.
    89  		return nil, errors.NewNotSupported(nil, "oyvey")
    90  	})
    91  	defer tools.UnregisterToolsDataSourceFunc("id0")
    92  	defer tools.UnregisterToolsDataSourceFunc("id1")
    93  
    94  	env := s.env(c, "config-tools-metadata-url")
    95  	sources, err := tools.GetMetadataSources(env)
    96  	c.Assert(err, jc.ErrorIsNil)
    97  	sstesting.AssertExpectedSources(c, sources, []sstesting.SourceDetails{
    98  		{"config-tools-metadata-url/", keys.JujuPublicKey},
    99  		{"betwixt/releases/", ""},
   100  		{"https://streams.canonical.com/juju/tools/", keys.JujuPublicKey},
   101  	})
   102  }
   103  
   104  func (s *URLsSuite) TestToolsMetadataURLsRegisteredFuncsError(c *gc.C) {
   105  	tools.RegisterToolsDataSourceFunc("id0", func(environs.Environ) (simplestreams.DataSource, error) {
   106  		// Non-NotSupported errors cause GetMetadataSources to fail.
   107  		return nil, errors.New("oyvey!")
   108  	})
   109  	defer tools.UnregisterToolsDataSourceFunc("id0")
   110  
   111  	env := s.env(c, "config-tools-metadata-url")
   112  	_, err := tools.GetMetadataSources(env)
   113  	c.Assert(err, gc.ErrorMatches, "oyvey!")
   114  }
   115  
   116  func (s *URLsSuite) TestToolsURL(c *gc.C) {
   117  	var toolsTests = []struct {
   118  		in          string
   119  		expected    string
   120  		expectedErr error
   121  	}{{
   122  		in:          "",
   123  		expected:    "",
   124  		expectedErr: nil,
   125  	}, {
   126  		in:          "file://foo",
   127  		expected:    "file://foo",
   128  		expectedErr: nil,
   129  	}, {
   130  		in:          "http://foo",
   131  		expected:    "http://foo",
   132  		expectedErr: nil,
   133  	}, {
   134  		in:          "foo",
   135  		expected:    "",
   136  		expectedErr: fmt.Errorf("foo is not an absolute path"),
   137  	}}
   138  	toolsTests = append(toolsTests, toolsTestsPlatformSpecific...)
   139  	for i, t := range toolsTests {
   140  		c.Logf("Test %d:", i)
   141  
   142  		out, err := tools.ToolsURL(t.in)
   143  		c.Assert(err, gc.DeepEquals, t.expectedErr)
   144  		c.Assert(out, gc.Equals, t.expected)
   145  	}
   146  }