func (c *SetConstraintsCommand) Init(args []string) (err error) { if c.ServiceName != "" && !names.IsService(c.ServiceName) { return fmt.Errorf("invalid service name %q", c.ServiceName) } c.Constraints, err = constraints.Parse(args...) return err }
func (c *GetConstraintsCommand) Init(args []string) error { if len(args) > 0 { if !names.IsService(args[0]) { return fmt.Errorf("invalid service name %q", args[0]) } c.ServiceName, args = args[0], args[1:] } return cmd.CheckEmpty(args) }
func (c *RemoveServiceCommand) Init(args []string) error { if len(args) == 0 { return fmt.Errorf("no service specified") } if !names.IsService(args[0]) { return fmt.Errorf("invalid service name %q", args[0]) } c.ServiceName, args = args[0], args[1:] return cmd.CheckEmpty(args) }
// Service returns a service state by name. func (st *State) Service(name string) (service *Service, err error) { if !names.IsService(name) { return nil, fmt.Errorf("%q is not a valid service name", name) } sdoc := &serviceDoc{} sel := bson.D{{"_id", name}} err = st.services.Find(sel).One(sdoc) if err == mgo.ErrNotFound { return nil, errors.NotFoundf("service %q", name) } if err != nil { return nil, fmt.Errorf("cannot get service %q: %v", name, err) } return newService(st, sdoc), nil }
func (c *DeployCommand) Init(args []string) error { switch len(args) { case 2: if !names.IsService(args[1]) { return fmt.Errorf("invalid service name %q", args[1]) } c.ServiceName = args[1] fallthrough case 1: if _, err := charm.InferURL(args[0], "fake"); err != nil { return fmt.Errorf("invalid charm name %q", args[0]) } c.CharmName = args[0] case 0: return errors.New("no charm specified") default: return cmd.CheckEmpty(args[2:]) } return c.UnitCommandBase.Init(args) }
// AddService creates a new service, running the supplied charm, with the // supplied name (which must be unique). If the charm defines peer relations, // they will be created automatically. func (st *State) AddService(name, ownerTag string, ch *Charm, includeNetworks, excludeNetworks []string) (service *Service, err error) { defer errors.Maskf(&err, "cannot add service %q", name) kind, ownerId, err := names.ParseTag(ownerTag, names.UserTagKind) if err != nil || kind != names.UserTagKind { return nil, fmt.Errorf("Invalid ownertag %s", ownerTag) } // Sanity checks. if !names.IsService(name) { return nil, fmt.Errorf("invalid name") } if ch == nil { return nil, fmt.Errorf("charm is nil") } if exists, err := isNotDead(st.services, name); err != nil { return nil, err } else if exists { return nil, fmt.Errorf("service already exists") } env, err := st.Environment() if err != nil { return nil, err } else if env.Life() != Alive { return nil, fmt.Errorf("environment is no longer alive") } if userExists, err := st.checkUserExists(ownerId); err != nil { return nil, err } else if !userExists { return nil, fmt.Errorf("user %v doesn't exist", ownerId) } // Create the service addition operations. peers := ch.Meta().Peers svcDoc := &serviceDoc{ Name: name, Series: ch.URL().Series, Subordinate: ch.Meta().Subordinate, CharmURL: ch.URL(), RelationCount: len(peers), Life: Alive, OwnerTag: ownerTag, } svc := newService(st, svcDoc) ops := []txn.Op{ env.assertAliveOp(), createConstraintsOp(st, svc.globalKey(), constraints.Value{}), // TODO(dimitern) 2014-04-04 bug #1302498 // Once we can add networks independently of machine // provisioning, we should check the given networks are valid // and known before setting them. createRequestedNetworksOp(st, svc.globalKey(), includeNetworks, excludeNetworks), createSettingsOp(st, svc.settingsKey(), nil), { C: st.users.Name, Id: ownerId, Assert: txn.DocExists, }, { C: st.settingsrefs.Name, Id: svc.settingsKey(), Assert: txn.DocMissing, Insert: settingsRefsDoc{1}, }, { C: st.services.Name, Id: name, Assert: txn.DocMissing, Insert: svcDoc, }} // Collect peer relation addition operations. peerOps, err := st.addPeerRelationsOps(name, peers) if err != nil { return nil, err } ops = append(ops, peerOps...) if err := st.runTransaction(ops); err == txn.ErrAborted { err := env.Refresh() if (err == nil && env.Life() != Alive) || errors.IsNotFound(err) { return nil, fmt.Errorf("environment is no longer alive") } else if err != nil { return nil, err } if userExists, ueErr := st.checkUserExists(ownerId); ueErr != nil { return nil, ueErr } else if !userExists { return nil, fmt.Errorf("unknown user %q", ownerId) } return nil, fmt.Errorf("service already exists") } else if err != nil { return nil, err } // Refresh to pick the txn-revno. if err = svc.Refresh(); err != nil { return nil, err } return svc, nil }