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 }