func (s *networkSuite) TestNetworkNames(c *gc.C) { for i, test := range networkNameTests { c.Logf("test %d: %q", i, test.pattern) c.Check(names.IsNetwork(test.pattern), gc.Equals, test.valid) if test.valid { expectTag := fmt.Sprintf("%s-%s", names.NetworkTagKind, test.pattern) c.Check(names.NetworkTag(test.pattern), gc.Equals, expectTag) } else { expectErr := fmt.Sprintf("%q is not a valid network name", test.pattern) testNetworkTag := func() { names.NetworkTag(test.pattern) } c.Check(testNetworkTag, gc.PanicMatches, regexp.QuoteMeta(expectErr)) } } }
// AddNetwork creates a new network with the given params. If a // network with the same name or provider id already exists in state, // an error satisfying errors.IsAlreadyExists is returned. func (st *State) AddNetwork(args NetworkInfo) (n *Network, err error) { defer errors.Contextf(&err, "cannot add network %q", args.Name) if args.CIDR != "" { _, _, err := net.ParseCIDR(args.CIDR) if err != nil { return nil, err } } if args.Name == "" { return nil, fmt.Errorf("name must be not empty") } if !names.IsNetwork(args.Name) { return nil, fmt.Errorf("invalid name") } if args.ProviderId == "" { return nil, fmt.Errorf("provider id must be not empty") } if args.VLANTag < 0 || args.VLANTag > 4094 { return nil, fmt.Errorf("invalid VLAN tag %d: must be between 0 and 4094", args.VLANTag) } doc := newNetworkDoc(args) ops := []txn.Op{{ C: st.networks.Name, Id: args.Name, Assert: txn.DocMissing, Insert: doc, }} err = st.runTransaction(ops) switch err { case txn.ErrAborted: if _, err = st.Network(args.Name); err == nil { return nil, errors.AlreadyExistsf("network %q", args.Name) } else if err != nil { return nil, err } case nil: // We have a unique key restriction on the ProviderId field, // which will cause the insert to fail if there is another // record with the same provider id in the table. The txn // logic does not report insertion errors, so we check that // the record has actually been inserted correctly before // reporting success. if _, err = st.Network(args.Name); err != nil { return nil, errors.AlreadyExistsf("network with provider id %q", args.ProviderId) } return newNetwork(st, doc), nil } return nil, err }