Created by Ian Booth on 2013-01-24 and last modified on 2013-01-24
Get this branch:
bzr branch lp:~wallyworld/goose/trunk
Only Ian Booth can upload to this branch. If you are Ian Booth please log in for upload directions.

Branch merges

Related bugs

Related blueprints

Branch information

Ian Booth
Go OpenStack Exchange

Recent revisions

52. By Ian Booth on 2013-01-24

First cut at infrastructure to allow service doubles to return errors as required

51. By Ian Booth on 2013-01-24

Goose test infrastructure improvements

This branch improves the usabilty of the goose test infrastructure.

A full Openstack service test double is provided. A bunch of manual coding which was required in each test suite to set up various Openstack module test doubles is replaced by a few lines of code.

New code:

        cred := &identity.Credentials{...}
 openstack := openstack.New(cred)

Old code:

 // Create the identity service.
 s.identityDouble = identityservice.NewUserPass()
 token := s.identityDouble.AddUser(s.cred.User, s.cred.Secrets)
 s.Mux.Handle(baseIdentityURL, s.identityDouble)

 // Register Swift endpoints with identity service.
 ep := identityservice.Endpoint{
  AdminURL: s.Server.URL + baseSwiftURL,
  InternalURL: s.Server.URL + baseSwiftURL,
  PublicURL: s.Server.URL + baseSwiftURL,
  Region: s.cred.Region,
 service := identityservice.Service{"swift", "object-store", []identityservice.Endpoint{ep}}
 s.swiftDouble = swiftservice.New("localhost", baseSwiftURL+"/", token)
 s.Mux.Handle(baseSwiftURL+"/", s.swiftDouble)

 // Register Nova endpoints with identity service.
 ep = identityservice.Endpoint{
  AdminURL: s.Server.URL + baseNovaURL,
  InternalURL: s.Server.URL + baseNovaURL,
  PublicURL: s.Server.URL + baseNovaURL,
  Region: s.cred.Region,
 service = identityservice.Service{"nova", "compute", []identityservice.Endpoint{ep}}
 s.novaDouble = novaservice.New("localhost", "V1", token, "1")

Other changes include:

- fix the identity service double to remove the hard coded userId and tenantId.
- do not hard code a fixed token against a service double - each user is assigned their own token just like a real instance, allowing multi-user tests to be written.
- improvements to the Swift service double to make it use URLs which are compliant with how a real Swift instance would do it.
- factor out a common base class for the legacy and userpass double implementations.
- use a SetupHTTP() for all test doubles instead of requiring the coder to know the magic URL paths to use.


50. By Martin Packman on 2013-01-23

Add simple tool for deleting security groups

Basic test of using the current api for doing some actual task. As the
live tests create lots of security groups without ever deleting them
it's also sort of useful to have around.

R=wallyworld, jameinel, rog, dimitern

49. By John A Meinel on 2013-01-23

test.py: add a python script for running the test suite.

Also has flags for setting up the tarmac test suite.

48. By Ian Booth on 2013-01-21

Use nova service doubles in nova tests

This branch plugs the nova service doubles into the nova live tests and makes everything work.
So now, in the nova package, "go test -gocheck.v" runs the tests against the doubles, and
"go test -gocheck.v -live" uses an Openstack instance.

Also, the rate limit retry test is now only run locally against the service doubles, where a special
request is used to trigger a rate limit service response. This replaces the previous test which
hammered a real Openstack instance to try and induce a rate limit response.

A few things needed to be done, and as a result of implementation changes to the service doubles,
changes were also needed for the service double unit tests.

 Viewing highlights:

1. Default security group

A real Openstack instance always has a default security group. The nova double and associated unit tests were modified

2. Out of the box flavours

The real Openstack instance used for testing has flavours defined out of the box. The live tests assume this behaviour
so the test double needed to be modifed to match.

3. Response changes

Some changes were required to certain response data eg creating a security group rule

4. ** This issue will need a follow up change **

The security group rule response contains a SecurityGroupRef struct:

type SecurityGroupRule struct {
 FromPort *int `json:"from_port"` // Can be nil
 IPProtocol *string `json:"ip_protocol"` // Can be nil
 ToPort *int `json:"to_port"` // Can be nil
 ParentGroupId int `json:"parent_group_id"`
 IPRange map[string]string `json:"ip_range"` // Can be empty
 Id int
 Group SecurityGroupRef

The was defined as a pointer ie Group *SecurityGroupRef.
However, nova double tests which do a DeepEquals to compare security group rules
fail because the pointer deferencing isn't done. So to make stuff work, I've
used a struct value instead and use the zeroSecurityGroupRef pattern as used
on the ec2 side. This isn't desirable and should be looked at. But if we are
prepared to go with it for now, it can be fixed in a followup branch. BTW, nothing
uses this attribute value so the change should not break juju core.

R=dimitern, jameinel

47. By Martin Packman on 2013-01-14

Introduce container ACLs

The purpose of this branch is to support Swift container ACLs, allowing a
public container to be set up to store the juju tools. Containers which are
public do not require authorisation tokens, and the setup workflow for
accessing the container is different.

For a private container, the OpenStack client authenticates in order to not
only get the authorisation token, but also the URLs used to access the
various service end points (incl swift).

For public containers, we just want to be able to nominate the swift URL

So the OpenStack client implementation has been split into authenticating
and nonauthenticating variants. Authenticating clients are initialised with
user credentials as before. Unauthenticating clients are given a base URL.
The swift client doesn't care whether it is initialised with a public or
authenticating connection to OpenStack; it works the same either way, but
operations which are forbidden by the ACL will return a 401.

46. By Dimiter Naydenov on 2013-01-11

nova double: list server filters and run server.

Implemented filters by status and name (others not implemented, but
probably also not needed), as well as creating a server (RunServer).

Added a few needed things: serverByName and generateUUID + tests.

With this, the nova double will be up-to-date with the nova client
and functional.

R=fwereade, rog

45. By Dimiter Naydenov on 2012-12-20

Improved documentation and comments.

I took an old branch of mine with some more comments merged them into the current state of trunk.

Old branch is at:
(but I'll remove it, once this lands).


44. By John A Meinel on 2012-12-20

goose: make nova compatible with novaservice

Expose SetupHTTP, since that seems to be how the service is meant to be used.
Change the error classes to not use global state, but instead grab the values
from the new '*Nova' attribute. The static errors won't have one, but that
didn't break any tests. Either the testing is incomplete, or the point where
we rewrap any errors into an actual error is handling it correctly.
Change lbox.check so that we know 'go build ./...' is happy, so we will
be less likely to run into this in the future.
Note that none of the 'local_tests' actually used the nova double, so
having it 'working' is a bit of a misnomer. It just builds, it wasn't
being used anyway.


43. By Dimiter Naydenov on 2012-12-19

nova double: Rest of HTTP API.

This implements the rest of the HTTP API of the Nova testing double:
* servers
* servers/detail
* servers/<id>/os-security-groups
* servers/<id>/action (add/removeSecurityGroup; add/removeFloatingIp)
* os-security-groups
* os-security-group-rules
* os-floating-ips

There are a few things to change in order to integrate with the Nova client and the local "live" tests, but this will come in a follow-up.

R=fwereade, rog, jameinel

Branch metadata

Branch format:
Branch format 7
Repository format:
Bazaar repository format 2a (needs bzr 1.16 or later)
Stacked on:
This branch contains Public information 
Everyone can see this information.