github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/resource/cmd/show_service_test.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package cmd
     5  
     6  import (
     7  	"time"
     8  
     9  	jujucmd "github.com/juju/cmd"
    10  	"github.com/juju/errors"
    11  	"github.com/juju/testing"
    12  	jc "github.com/juju/testing/checkers"
    13  	gc "gopkg.in/check.v1"
    14  	charmresource "gopkg.in/juju/charm.v6-unstable/resource"
    15  	"gopkg.in/juju/names.v2"
    16  
    17  	"github.com/juju/juju/resource"
    18  )
    19  
    20  var _ = gc.Suite(&ShowServiceSuite{})
    21  
    22  type ShowServiceSuite struct {
    23  	testing.IsolationSuite
    24  
    25  	stubDeps *stubShowServiceDeps
    26  }
    27  
    28  func (s *ShowServiceSuite) SetUpTest(c *gc.C) {
    29  	s.IsolationSuite.SetUpTest(c)
    30  
    31  	stub := &testing.Stub{}
    32  	s.stubDeps = &stubShowServiceDeps{
    33  		stub:   stub,
    34  		client: &stubServiceClient{stub: stub},
    35  	}
    36  }
    37  
    38  func (*ShowServiceSuite) TestInitEmpty(c *gc.C) {
    39  	s := ShowServiceCommand{}
    40  
    41  	err := s.Init([]string{})
    42  	c.Assert(err, jc.Satisfies, errors.IsBadRequest)
    43  }
    44  
    45  func (*ShowServiceSuite) TestInitGood(c *gc.C) {
    46  	s := ShowServiceCommand{}
    47  	err := s.Init([]string{"foo"})
    48  	c.Assert(err, jc.ErrorIsNil)
    49  	c.Assert(s.target, gc.Equals, "foo")
    50  }
    51  
    52  func (*ShowServiceSuite) TestInitTooManyArgs(c *gc.C) {
    53  	s := ShowServiceCommand{}
    54  
    55  	err := s.Init([]string{"foo", "bar"})
    56  	c.Assert(err, jc.Satisfies, errors.IsBadRequest)
    57  }
    58  
    59  func (s *ShowServiceSuite) TestInfo(c *gc.C) {
    60  	var command ShowServiceCommand
    61  	info := command.Info()
    62  
    63  	c.Check(info, jc.DeepEquals, &jujucmd.Info{
    64  		Name:    "resources",
    65  		Aliases: []string{"list-resources"},
    66  		Args:    "application-or-unit",
    67  		Purpose: "show the resources for a service or unit",
    68  		Doc: `
    69  This command shows the resources required by and those in use by an existing
    70  application or unit in your model.  When run for an application, it will also show any
    71  updates available for resources from the charmstore.
    72  `,
    73  	})
    74  }
    75  
    76  func (s *ShowServiceSuite) TestRun(c *gc.C) {
    77  	data := []resource.ServiceResources{
    78  		{
    79  			Resources: []resource.Resource{
    80  				{
    81  					Resource: charmresource.Resource{
    82  						Meta: charmresource.Meta{
    83  							Name:        "openjdk",
    84  							Description: "the java runtime",
    85  						},
    86  						Origin:   charmresource.OriginStore,
    87  						Revision: 7,
    88  					},
    89  				},
    90  				{
    91  					Resource: charmresource.Resource{
    92  						Meta: charmresource.Meta{
    93  							Name:        "website",
    94  							Description: "your website data",
    95  						},
    96  						Origin: charmresource.OriginUpload,
    97  					},
    98  				},
    99  				{
   100  					Resource: charmresource.Resource{
   101  						Meta: charmresource.Meta{
   102  							Name:        "rsc1234",
   103  							Description: "a big description",
   104  						},
   105  						Origin:   charmresource.OriginStore,
   106  						Revision: 15,
   107  					},
   108  					Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC),
   109  				},
   110  				{
   111  					Resource: charmresource.Resource{
   112  						Meta: charmresource.Meta{
   113  							Name:        "website2",
   114  							Description: "awesome data",
   115  						},
   116  						Origin: charmresource.OriginUpload,
   117  					},
   118  					Username:  "Bill User",
   119  					Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC),
   120  				},
   121  			},
   122  			CharmStoreResources: []charmresource.Resource{
   123  				{
   124  					// This resource has a higher revision than the corresponding one
   125  					// above.
   126  					Meta: charmresource.Meta{
   127  						Name:        "openjdk",
   128  						Description: "the java runtime",
   129  						Type:        charmresource.TypeFile,
   130  						Path:        "foobar",
   131  					},
   132  					Revision: 10,
   133  					Origin:   charmresource.OriginStore,
   134  				},
   135  				{
   136  					// This resource is the same revision as the corresponding one
   137  					// above.
   138  					Meta: charmresource.Meta{
   139  						Name:        "rsc1234",
   140  						Description: "a big description",
   141  						Type:        charmresource.TypeFile,
   142  						Path:        "foobar",
   143  					},
   144  					Revision: 15,
   145  					Origin:   charmresource.OriginStore,
   146  				},
   147  				{
   148  					Meta: charmresource.Meta{
   149  						Name:        "website",
   150  						Description: "your website data",
   151  					},
   152  					Origin: charmresource.OriginUpload,
   153  				},
   154  				{
   155  					Meta: charmresource.Meta{
   156  						Name:        "website2",
   157  						Description: "awesome data",
   158  					},
   159  					Origin: charmresource.OriginUpload,
   160  				},
   161  			},
   162  		},
   163  	}
   164  	s.stubDeps.client.ReturnResources = data
   165  
   166  	cmd := &ShowServiceCommand{
   167  		deps: ShowServiceDeps{
   168  			NewClient: s.stubDeps.NewClient,
   169  		},
   170  	}
   171  
   172  	code, stdout, stderr := runCmd(c, cmd, "svc")
   173  	c.Check(code, gc.Equals, 0)
   174  	c.Check(stderr, gc.Equals, "")
   175  
   176  	c.Check(stdout, gc.Equals, `
   177  [Service]
   178  RESOURCE  SUPPLIED BY  REVISION
   179  openjdk   charmstore   7
   180  website   upload       -
   181  rsc1234   charmstore   15
   182  website2  Bill User    2012-12-12T12:12
   183  
   184  [Updates Available]
   185  RESOURCE  REVISION
   186  openjdk   10
   187  
   188  `[1:])
   189  
   190  	s.stubDeps.stub.CheckCall(c, 1, "ListResources", []string{"svc"})
   191  }
   192  
   193  func (s *ShowServiceSuite) TestRunUnit(c *gc.C) {
   194  	data := []resource.ServiceResources{{
   195  		UnitResources: []resource.UnitResources{{
   196  			Tag: names.NewUnitTag("svc/0"),
   197  			Resources: []resource.Resource{
   198  				{
   199  					Resource: charmresource.Resource{
   200  						Meta: charmresource.Meta{
   201  							Name:        "rsc1234",
   202  							Description: "a big description",
   203  						},
   204  						Origin:   charmresource.OriginStore,
   205  						Revision: 15,
   206  					},
   207  					Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC),
   208  				},
   209  				{
   210  					Resource: charmresource.Resource{
   211  						Meta: charmresource.Meta{
   212  							Name:        "website2",
   213  							Description: "awesome data",
   214  						},
   215  						Origin: charmresource.OriginUpload,
   216  						Size:   15,
   217  					},
   218  					Username:  "Bill User",
   219  					Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC),
   220  				},
   221  			},
   222  			DownloadProgress: map[string]int64{
   223  				"website2": 12,
   224  			},
   225  		}},
   226  	}}
   227  	s.stubDeps.client.ReturnResources = data
   228  
   229  	cmd := &ShowServiceCommand{
   230  		deps: ShowServiceDeps{
   231  			NewClient: s.stubDeps.NewClient,
   232  		},
   233  	}
   234  
   235  	code, stdout, stderr := runCmd(c, cmd, "svc/0")
   236  	c.Assert(code, gc.Equals, 0)
   237  	c.Assert(stderr, gc.Equals, "")
   238  
   239  	c.Check(stdout, gc.Equals, `
   240  [Unit]
   241  RESOURCE  REVISION
   242  rsc1234   15
   243  website2  2012-12-12T12:12
   244  
   245  `[1:])
   246  
   247  	s.stubDeps.stub.CheckCall(c, 1, "ListResources", []string{"svc"})
   248  }
   249  
   250  func (s *ShowServiceSuite) TestRunDetails(c *gc.C) {
   251  	data := []resource.ServiceResources{{
   252  		Resources: []resource.Resource{
   253  			{
   254  				Resource: charmresource.Resource{
   255  					Meta: charmresource.Meta{
   256  						Name:        "alpha",
   257  						Description: "a big comment",
   258  					},
   259  					Origin:   charmresource.OriginStore,
   260  					Revision: 15,
   261  					Size:     113,
   262  				},
   263  				Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC),
   264  			},
   265  			{
   266  				Resource: charmresource.Resource{
   267  					Meta: charmresource.Meta{
   268  						Name:        "charlie",
   269  						Description: "awesome data",
   270  					},
   271  					Origin: charmresource.OriginUpload,
   272  					Size:   9835617,
   273  				},
   274  				Username:  "Bill User",
   275  				Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC),
   276  			},
   277  			{
   278  				Resource: charmresource.Resource{
   279  					Meta: charmresource.Meta{
   280  						Name:        "beta",
   281  						Description: "more data",
   282  					},
   283  					Origin: charmresource.OriginUpload,
   284  				},
   285  				Username:  "Bill User",
   286  				Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC),
   287  			},
   288  		},
   289  		CharmStoreResources: []charmresource.Resource{
   290  			{
   291  				Meta: charmresource.Meta{
   292  					Name:        "alpha",
   293  					Description: "a big comment",
   294  				},
   295  				Origin:   charmresource.OriginStore,
   296  				Revision: 15,
   297  			},
   298  			{
   299  				Meta: charmresource.Meta{
   300  					Name:        "charlie",
   301  					Description: "awesome data",
   302  				},
   303  				Origin: charmresource.OriginUpload,
   304  			},
   305  			{
   306  				Meta: charmresource.Meta{
   307  					Name:        "beta",
   308  					Description: "more data",
   309  				},
   310  				Origin: charmresource.OriginUpload,
   311  			},
   312  		},
   313  		UnitResources: []resource.UnitResources{
   314  			{
   315  				Tag: names.NewUnitTag("svc/10"),
   316  				Resources: []resource.Resource{
   317  					{
   318  						Resource: charmresource.Resource{
   319  							Meta: charmresource.Meta{
   320  								Name:        "alpha",
   321  								Description: "a big comment",
   322  							},
   323  							Origin:   charmresource.OriginStore,
   324  							Revision: 10, // note the reivision is different for this unit
   325  						},
   326  						Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC),
   327  					},
   328  					{
   329  						Resource: charmresource.Resource{
   330  							Meta: charmresource.Meta{
   331  								Name:        "charlie",
   332  								Description: "awesome data",
   333  							},
   334  							Origin: charmresource.OriginUpload,
   335  						},
   336  						Username: "Bill User",
   337  						// note the different time
   338  						Timestamp: time.Date(2011, 11, 11, 11, 11, 11, 0, time.UTC),
   339  					},
   340  					// note we're missing the beta resource for this unit
   341  				},
   342  				DownloadProgress: map[string]int64{
   343  					"alpha":   17,
   344  					"charlie": 899937,
   345  				},
   346  			},
   347  			{
   348  				Tag: names.NewUnitTag("svc/5"),
   349  				Resources: []resource.Resource{
   350  					{
   351  						Resource: charmresource.Resource{
   352  							Meta: charmresource.Meta{
   353  								Name:        "alpha",
   354  								Description: "a big comment",
   355  							},
   356  							Origin:   charmresource.OriginStore,
   357  							Revision: 10, // note the reivision is different for this unit
   358  						},
   359  						Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC),
   360  					},
   361  					{
   362  						Resource: charmresource.Resource{
   363  							Meta: charmresource.Meta{
   364  								Name:        "charlie",
   365  								Description: "awesome data",
   366  							},
   367  							Origin: charmresource.OriginUpload,
   368  						},
   369  						Username: "Bill User",
   370  						// note the different time
   371  						Timestamp: time.Date(2011, 11, 11, 11, 11, 11, 0, time.UTC),
   372  					},
   373  					{
   374  						Resource: charmresource.Resource{
   375  							Meta: charmresource.Meta{
   376  								Name:        "beta",
   377  								Description: "more data",
   378  							},
   379  							Origin: charmresource.OriginUpload,
   380  						},
   381  						Username:  "Bill User",
   382  						Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC),
   383  					},
   384  				},
   385  				DownloadProgress: map[string]int64{
   386  					"charlie": 177331,
   387  				},
   388  			},
   389  		},
   390  	}}
   391  	s.stubDeps.client.ReturnResources = data
   392  
   393  	cmd := &ShowServiceCommand{
   394  		deps: ShowServiceDeps{
   395  			NewClient: s.stubDeps.NewClient,
   396  		},
   397  	}
   398  
   399  	code, stdout, stderr := runCmd(c, cmd, "svc", "--details")
   400  	c.Check(code, gc.Equals, 0)
   401  	c.Check(stderr, gc.Equals, "")
   402  
   403  	c.Check(stdout, gc.Equals, `
   404  [Units]
   405  UNIT  RESOURCE  REVISION          EXPECTED
   406  5     alpha     10                15
   407  5     beta      2012-12-12T12:12  2012-12-12T12:12
   408  5     charlie   2011-11-11T11:11  2012-12-12T12:12 (fetching: 2%)
   409  10    alpha     10                15 (fetching: 15%)
   410  10    beta      -                 2012-12-12T12:12
   411  10    charlie   2011-11-11T11:11  2012-12-12T12:12 (fetching: 9%)
   412  
   413  `[1:])
   414  
   415  	s.stubDeps.stub.CheckCall(c, 1, "ListResources", []string{"svc"})
   416  }
   417  
   418  func (s *ShowServiceSuite) TestRunUnitDetails(c *gc.C) {
   419  	data := []resource.ServiceResources{{
   420  		Resources: []resource.Resource{
   421  			{
   422  				Resource: charmresource.Resource{
   423  					Meta: charmresource.Meta{
   424  						Name:        "alpha",
   425  						Description: "a big comment",
   426  					},
   427  					Origin:   charmresource.OriginStore,
   428  					Revision: 15,
   429  					Size:     113,
   430  				},
   431  				Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC),
   432  			},
   433  			{
   434  				Resource: charmresource.Resource{
   435  					Meta: charmresource.Meta{
   436  						Name:        "charlie",
   437  						Description: "awesome data",
   438  					},
   439  					Origin: charmresource.OriginUpload,
   440  					Size:   9835617,
   441  				},
   442  				Username:  "Bill User",
   443  				Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC),
   444  			},
   445  			{
   446  				Resource: charmresource.Resource{
   447  					Meta: charmresource.Meta{
   448  						Name:        "beta",
   449  						Description: "more data",
   450  					},
   451  					Origin: charmresource.OriginUpload,
   452  				},
   453  				Username:  "Bill User",
   454  				Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC),
   455  			},
   456  		},
   457  		UnitResources: []resource.UnitResources{
   458  			{
   459  				Tag: names.NewUnitTag("svc/10"),
   460  				Resources: []resource.Resource{
   461  					{
   462  						Resource: charmresource.Resource{
   463  							Meta: charmresource.Meta{
   464  								Name:        "alpha",
   465  								Description: "a big comment",
   466  							},
   467  							Origin:   charmresource.OriginStore,
   468  							Revision: 10, // note the reivision is different for this unit
   469  						},
   470  						Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC),
   471  					},
   472  					{
   473  						Resource: charmresource.Resource{
   474  							Meta: charmresource.Meta{
   475  								Name:        "charlie",
   476  								Description: "awesome data",
   477  							},
   478  							Origin: charmresource.OriginUpload,
   479  						},
   480  						Username: "Bill User",
   481  						// note the different time
   482  						Timestamp: time.Date(2011, 11, 11, 11, 11, 11, 0, time.UTC),
   483  					},
   484  					// note we're missing the beta resource for this unit
   485  				},
   486  				DownloadProgress: map[string]int64{
   487  					"charlie": 17,
   488  				},
   489  			},
   490  			{
   491  				Tag: names.NewUnitTag("svc/5"),
   492  				Resources: []resource.Resource{
   493  					{
   494  						Resource: charmresource.Resource{
   495  							Meta: charmresource.Meta{
   496  								Name:        "alpha",
   497  								Description: "a big comment",
   498  							},
   499  							Origin:   charmresource.OriginStore,
   500  							Revision: 10, // note the reivision is different for this unit
   501  						},
   502  						Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC),
   503  					},
   504  					{
   505  						Resource: charmresource.Resource{
   506  							Meta: charmresource.Meta{
   507  								Name:        "charlie",
   508  								Description: "awesome data",
   509  							},
   510  							Origin: charmresource.OriginUpload,
   511  						},
   512  						Username: "Bill User",
   513  						// note the different time
   514  						Timestamp: time.Date(2011, 11, 11, 11, 11, 11, 0, time.UTC),
   515  					},
   516  					{
   517  						Resource: charmresource.Resource{
   518  							Meta: charmresource.Meta{
   519  								Name:        "beta",
   520  								Description: "more data",
   521  							},
   522  							Origin: charmresource.OriginUpload,
   523  						},
   524  						Username:  "Bill User",
   525  						Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC),
   526  					},
   527  				},
   528  			},
   529  		},
   530  	}}
   531  	s.stubDeps.client.ReturnResources = data
   532  
   533  	cmd := &ShowServiceCommand{
   534  		deps: ShowServiceDeps{
   535  			NewClient: s.stubDeps.NewClient,
   536  		},
   537  	}
   538  
   539  	code, stdout, stderr := runCmd(c, cmd, "svc/10", "--details")
   540  	c.Assert(code, gc.Equals, 0)
   541  	c.Assert(stderr, gc.Equals, "")
   542  
   543  	c.Check(stdout, gc.Equals, `
   544  [Unit]
   545  RESOURCE  REVISION          EXPECTED
   546  alpha     10                15
   547  beta      -                 2012-12-12T12:12
   548  charlie   2011-11-11T11:11  2012-12-12T12:12 (fetching: 0%)
   549  
   550  `[1:])
   551  
   552  	s.stubDeps.stub.CheckCall(c, 1, "ListResources", []string{"svc"})
   553  }
   554  
   555  type stubShowServiceDeps struct {
   556  	stub   *testing.Stub
   557  	client *stubServiceClient
   558  }
   559  
   560  func (s *stubShowServiceDeps) NewClient(c *ShowServiceCommand) (ShowServiceClient, error) {
   561  	s.stub.AddCall("NewClient", c)
   562  	if err := s.stub.NextErr(); err != nil {
   563  		return nil, errors.Trace(err)
   564  	}
   565  
   566  	return s.client, nil
   567  }
   568  
   569  type stubServiceClient struct {
   570  	stub            *testing.Stub
   571  	ReturnResources []resource.ServiceResources
   572  }
   573  
   574  func (s *stubServiceClient) ListResources(services []string) ([]resource.ServiceResources, error) {
   575  	s.stub.AddCall("ListResources", services)
   576  	if err := s.stub.NextErr(); err != nil {
   577  		return nil, errors.Trace(err)
   578  	}
   579  	return s.ReturnResources, nil
   580  }
   581  
   582  func (s *stubServiceClient) Close() error {
   583  	s.stub.AddCall("Close")
   584  	if err := s.stub.NextErr(); err != nil {
   585  		return errors.Trace(err)
   586  	}
   587  
   588  	return nil
   589  }