github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/apiserver/common/networkingcommon/spaces.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package networkingcommon
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"gopkg.in/juju/names.v2"
     9  
    10  	"github.com/juju/juju/apiserver/common"
    11  	"github.com/juju/juju/apiserver/params"
    12  	"github.com/juju/juju/environs"
    13  	"github.com/juju/juju/network"
    14  )
    15  
    16  // SupportsSpaces checks if the environment implements NetworkingEnviron
    17  // and also if it supports spaces.
    18  func SupportsSpaces(backing environs.EnvironConfigGetter) error {
    19  	env, err := environs.GetEnviron(backing, environs.New)
    20  	if err != nil {
    21  		return errors.Annotate(err, "getting environ")
    22  	}
    23  	if !environs.SupportsSpaces(env) {
    24  		return errors.NotSupportedf("spaces")
    25  	}
    26  	return nil
    27  }
    28  
    29  // CreateSpaces creates a new Juju network space, associating the
    30  // specified subnets with it (optional; can be empty).
    31  func CreateSpaces(backing NetworkBacking, args params.CreateSpacesParams) (results params.ErrorResults, err error) {
    32  	err = SupportsSpaces(backing)
    33  	if err != nil {
    34  		return results, common.ServerError(errors.Trace(err))
    35  	}
    36  
    37  	results.Results = make([]params.ErrorResult, len(args.Spaces))
    38  
    39  	for i, space := range args.Spaces {
    40  		err := createOneSpace(backing, space)
    41  		if err == nil {
    42  			continue
    43  		}
    44  		results.Results[i].Error = common.ServerError(errors.Trace(err))
    45  	}
    46  
    47  	return results, nil
    48  }
    49  
    50  func createOneSpace(backing NetworkBacking, args params.CreateSpaceParams) error {
    51  	// Validate the args, assemble information for api.backing.AddSpaces
    52  	var subnets []string
    53  
    54  	spaceTag, err := names.ParseSpaceTag(args.SpaceTag)
    55  	if err != nil {
    56  		return errors.Trace(err)
    57  	}
    58  
    59  	for _, tag := range args.SubnetTags {
    60  		subnetTag, err := names.ParseSubnetTag(tag)
    61  		if err != nil {
    62  			return errors.Trace(err)
    63  		}
    64  		subnets = append(subnets, subnetTag.Id())
    65  	}
    66  
    67  	// Add the validated space.
    68  	err = backing.AddSpace(spaceTag.Id(), network.Id(args.ProviderId), subnets, args.Public)
    69  	if err != nil {
    70  		return errors.Trace(err)
    71  	}
    72  	return nil
    73  }