// FindEntity returns the entity with the given tag. // // The returned value can be of type *Machine, *Unit, // *User, *Service or *Environment, depending // on the tag. func (st *State) FindEntity(tag string) (Entity, error) { kind, id, err := names.ParseTag(tag, "") switch kind { case names.MachineTagKind: return st.Machine(id) case names.UnitTagKind: return st.Unit(id) case names.UserTagKind: return st.User(id) case names.ServiceTagKind: return st.Service(id) case names.EnvironTagKind: env, err := st.Environment() if err != nil { return nil, err } // Return an invalid entity error if the requested environment is not // the current one. if id != env.UUID() { if utils.IsValidUUIDString(id) { return nil, errors.NotFoundf("environment %q", id) } // TODO(axw) 2013-12-04 #1257587 // We should not accept environment tags that do not match the // environment's UUID. We accept anything for now, to cater // both for past usage, and for potentially supporting aliases. logger.Warningf("environment-tag does not match current environment UUID: %q != %q", id, env.UUID()) conf, err := st.EnvironConfig() if err != nil { logger.Warningf("EnvironConfig failed: %v", err) } else if id != conf.Name() { logger.Warningf("environment-tag does not match current environment name: %q != %q", id, conf.Name()) } } return env, nil case names.RelationTagKind: return st.KeyRelation(id) case names.NetworkTagKind: return st.Network(id) } return nil, err }
func (uuidSuite) TestIsValidUUIDFailsWhenNotValid(c *gc.C) { c.Assert(utils.IsValidUUIDString("blah"), gc.Equals, false) }