// 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 }
// 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); err != nil { return err } // Reject skill with invalid names if err := ValidateName(slot.Name); err != nil { return err } // TODO: ensure that apps are correct t := r.types[slot.Type] if t == nil { return fmt.Errorf("cannot add skill slot, skill type %q is not known", slot.Type) } if err := t.SanitizeSlot(slot); err != nil { return fmt.Errorf("cannot add slot: %v", err) } if _, ok := r.slots[slot.Snap][slot.Name]; ok { return fmt.Errorf("cannot add skill slot, snap %q already has slot %q", slot.Snap, slot.Name) } if r.slots[slot.Snap] == nil { r.slots[slot.Snap] = make(map[string]*Slot) } r.slots[slot.Snap][slot.Name] = slot return nil }
// 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 }
// AddSkill adds a skill to the repository. // Skill names must be valid snap names, as defined by ValidateName. // Skill name must be unique within a particular snap. func (r *Repository) AddSkill(skill *Skill) error { r.m.Lock() defer r.m.Unlock() // Reject snaps with invalid names if err := snap.ValidateName(skill.Snap); err != nil { return err } // Reject skill with invalid names if err := ValidateName(skill.Name); err != nil { return err } t := r.types[skill.Type] if t == nil { return fmt.Errorf("cannot add skill, skill type %q is not known", skill.Type) } // Reject skill that don't pass type-specific sanitization if err := t.SanitizeSkill(skill); err != nil { return fmt.Errorf("cannot add skill: %v", err) } if _, ok := r.skills[skill.Snap][skill.Name]; ok { return fmt.Errorf("cannot add skill, snap %q already has skill %q", skill.Snap, skill.Name) } if r.skills[skill.Snap] == nil { r.skills[skill.Snap] = make(map[string]*Skill) } r.skills[skill.Snap][skill.Name] = skill return nil }