// AddPlug adds a plug to the repository. // Plug names must be valid snap names, as defined by ValidateName. // Plug name must be unique within a particular snap. func (r *Repository) AddPlug(plug *Plug) error { r.m.Lock() defer r.m.Unlock() // Reject snaps with invalid names if err := snap.ValidateName(plug.Snap.Name()); err != nil { return err } // Reject plug with invalid names if err := ValidateName(plug.Name); err != nil { return err } i := r.ifaces[plug.Interface] if i == nil { return fmt.Errorf("cannot add plug, interface %q is not known", plug.Interface) } // Reject plug that don't pass interface-specific sanitization if err := i.SanitizePlug(plug); err != nil { return fmt.Errorf("cannot add plug: %v", err) } if _, ok := r.plugs[plug.Snap.Name()][plug.Name]; ok { return fmt.Errorf("cannot add plug, snap %q already has plug %q", plug.Snap.Name(), plug.Name) } if r.plugs[plug.Snap.Name()] == nil { r.plugs[plug.Snap.Name()] = make(map[string]*Plug) } r.plugs[plug.Snap.Name()][plug.Name] = plug return nil }
// AddSlot adds a new slot to the repository. // Adding a slot with invalid name returns an error. // Adding a slot that has the same name and snap name as another slot returns an error. func (r *Repository) AddSlot(slot *Slot) error { r.m.Lock() defer r.m.Unlock() // Reject snaps with invalid names if err := snap.ValidateName(slot.Snap.Name()); err != nil { return err } // Reject plug with invalid names if err := ValidateName(slot.Name); err != nil { return err } // TODO: ensure that apps are correct i := r.ifaces[slot.Interface] if i == nil { return fmt.Errorf("cannot add slot, interface %q is not known", slot.Interface) } if err := i.SanitizeSlot(slot); err != nil { return fmt.Errorf("cannot add slot: %v", err) } if _, ok := r.slots[slot.Snap.Name()][slot.Name]; ok { return fmt.Errorf("cannot add slot, snap %q already has slot %q", slot.Snap.Name(), slot.Name) } if r.slots[slot.Snap.Name()] == nil { r.slots[slot.Snap.Name()] = make(map[string]*Slot) } r.slots[slot.Snap.Name()][slot.Name] = slot return nil }
func findOne(c *Command, r *http.Request, user *auth.UserState, name string) Response { if err := snap.ValidateName(name); err != nil { return BadRequest(err.Error()) } theStore := getStore(c) snapInfo, err := theStore.Snap(name, "", false, snap.R(0), user) if err != nil { return InternalError("%v", err) } meta := &Meta{ SuggestedCurrency: theStore.SuggestedCurrency(), Sources: []string{"store"}, } results := make([]*json.RawMessage, 1) data, err := json.Marshal(webify(mapRemote(snapInfo), r.URL.String())) if err != nil { return InternalError(err.Error()) } results[0] = (*json.RawMessage)(&data) return SyncResponse(results, meta) }