Ah, ok now it makes sense the "IN", I thought you were only talking about
single values.



I do not think that the UUID (resource UUID) is the representation of ID
value in Hexadecimal, if it is we could simply get rid of one of them. I
really dislike these search criteria...I am not seeing what you are saying.
Let´s see this in SQL, so we can discuss.

SELECT * FROM resource_tags
WHERE  (resource_id in (....) OR resource_uuid in (...))
AND resource_tags.resource_type = 'Account';


That is what the programmer who coded that Search criteria seemed to want,
right? I mean, the developer wanted to select resources that match either
the ID or UUID field. Also, we may have more than a single value to filter
in both ID and UUID. I am also assuming that UUID does not necessarily
represents the ID as a hexadecimal.

The problem seems to be when it is being translated:

> ( resource_tags.resource_id='2a4264fb-9f63-4d4f-9465-c1bc5440ea60'
> OR
> resource_tags.resource_uuid=_binary'2a4264fb-9f63-4d4f-9465-c1bc5440ea60'
> )
>

It is not even using an “IN” structure in the SQL. Also, why is the
resource_id equals the UUID in the filter. Did you check the entity that is
being sent as an example? Are the fields ID and UUID set with the same
values?



P.S. Normally the ID field of entities is not exposed to users via API. The
field ID in the API is translated to UUID in ACS. The field ID in the
database is intended as a dummy primary key for the table.


On Wed, Nov 22, 2017 at 9:05 AM, Ivan Kudryavtsev <kudryavtsev...@bw-sw.com>
wrote:

> Hi, Rafael, 'IN" because API call assumes that several resourceIds can be
> provided, so IN solves it, EQ doesn't.
>
> But despite semantics ID/UUID you see that ID is integer and UUID is string
> and that comparison does fault positive results, next when object access
> for caller is checked exception occured and no tag removal happen as a
> result because int(2) eq '2afcffdsfdsfds-... (UUID)".
>
> 2017-11-22 18:01 GMT+07:00 Rafael Weingärtner <rafaelweingart...@gmail.com
> >:
>
> > Are ID and UUID set with the same values in that entity? If not, the
> > criteria seem correct. I mean, it is trying to filter for an ID if it
> > exists or by UUID if it exists in the entity that is passed as an
> example.
> > What I do not understand is that they are using “SearchCriteria.Op.IN”,
> > but
> > in my opinion, it should be “SearchCriteria.Op.EQ”.
> >
> > On Wed, Nov 22, 2017 at 7:58 AM, Ivan Kudryavtsev <
> > kudryavtsev...@bw-sw.com>
> > wrote:
> >
> > > Hi, I found interesting behaviour with tags:
> > >
> > > mysql> SELECT resource_tags.id, resource_tags.uuid, resource_tags.key,
> > > resource_tags.value, resource_tags.domain_id, resource_tags.account_id,
> > > resource_tags.resource_id, resource_tags.resource_uuid,
> > > resource_tags.resource_type, resource_tags.customer FROM resource_tags
> > > WHERE  ( resource_tags.resource_id='2a4264fb-9f63-4d4f-9465-
> > c1bc5440ea60'
> > > OR
> > > resource_tags.resource_uuid=_binary'2a4264fb-9f63-4d4f-
> > 9465-c1bc5440ea60'
> > > )
> > >  AND resource_tags.resource_type = 'Account';
> > >
> > > +----+--------------------------------------+-------+-------
> > > +-----------+------------+-------------+--------------------
> > > ------------------+---------------+----------+
> > > | id | uuid                                 | key   | value |
> domain_id |
> > > account_id | resource_id | resource_uuid                        |
> > > resource_type | customer |
> > > +----+--------------------------------------+-------+-------
> > > +-----------+------------+-------------+--------------------
> > > ------------------+---------------+----------+
> > > |  7 | 95a1a314-2247-4622-a33f-b9b2680bc2e1 | test  | me    |
>  1
> > |
> > >        2 |           2 | 3199fc71-cf39-11e7-af5d-dc0ea16ecd7f |
> Account
> > >   | NULL     |
> > > | 10 | 6c247aa1-5524-4910-9b5f-c6cfd9b3bdd9 | test3 | me    |
>  1
> > |
> > >        4 |           4 | 2a4264fb-9f63-4d4f-9465-c1bc5440ea60 |
> Account
> > >   | NULL     |
> > > | 12 | 25fb7848-af34-42f7-855e-0f5909a4e979 | test5 | me2   |
>  1
> > |
> > >        4 |           4 | 2a4264fb-9f63-4d4f-9465-c1bc5440ea60 |
> Account
> > >   | NULL     |
> > > +----+--------------------------------------+-------+-------
> > > +-----------+------------+-------------+--------------------
> > > ------------------+---------------+----------+
> > > 3 rows in set, 1 warning (0.01 sec)
> > >
> > > Don't see that "resource_type" is "account". I just play with it.
> > >
> > > Take a look at ID=7. This row is found because:
> > >
> > > resource_tags.resource_id='2a4264fb-9f63-4d4f-9465-c1bc5440ea60' when
> > > right
> > > part is converted to int. Corresponding code is here:
> > >
> > > https://github.com/apache/cloudstack/blob/87ef8137534fa79810
> 1f65c6691fcf
> > > 71513ac978/server/src/com/cloud/tags/TaggedResourceManagerIm
> pl.java#L301
> > >
> > > sb.and().op("resourceId", sb.entity().getResourceId(),
> > > SearchCriteria.Op.IN);
> > > sb.or("resourceUuid", sb.entity().getResourceUuid(),
> > SearchCriteria.Op.IN
> > > );
> > > sb.cp();
> > > sb.and("resourceType", sb.entity().getResourceType(),
> > > SearchCriteria.Op.EQ);
> > >
> > > I don't know why the writer uses "resourceId" or "resourceUuid". I
> > suppose
> > > it's a bug and code should be transformed to:
> > >
> > > sb.and("resourceUuid", sb.entity().getResourceUuid(),
> > SearchCriteria.Op.IN
> > > );
> > > sb.and("resourceType", sb.entity().getResourceType(),
> > > SearchCriteria.Op.EQ);
> > >
> > > Or MySQL query should be transformed to:
> > >
> > > mysql> SELECT resource_tags.id, resource_tags.uuid, resource_tags.key,
> > > resource_tags.value, resource_tags.domain_id, resource_tags.account_id,
> > > resource_tags.resource_id, resource_tags.resource_uuid,
> > > resource_tags.resource_type, resource_tags.customer FROM resource_tags
> > > WHERE  ( concat("%", resource_tags.resource_id) =
> > > '2a4264fb-9f63-4d4f-9465-c1bc5440ea60' OR
> > > resource_tags.resource_uuid=_binary'2a4264fb-9f63-4d4f-
> > 9465-c1bc5440ea60'
> > > )
> > >  AND resource_tags.resource_type = 'Account';
> > > +----+--------------------------------------+-------+-------
> > > +-----------+------------+-------------+--------------------
> > > ------------------+---------------+----------+
> > > | id | uuid                                 | key   | value |
> domain_id |
> > > account_id | resource_id | resource_uuid                        |
> > > resource_type | customer |
> > > +----+--------------------------------------+-------+-------
> > > +-----------+------------+-------------+--------------------
> > > ------------------+---------------+----------+
> > > | 10 | 6c247aa1-5524-4910-9b5f-c6cfd9b3bdd9 | test3 | me    |
>  1
> > |
> > >        4 |           4 | 2a4264fb-9f63-4d4f-9465-c1bc5440ea60 |
> Account
> > >   | NULL     |
> > > | 12 | 25fb7848-af34-42f7-855e-0f5909a4e979 | test5 | me2   |
>  1
> > |
> > >        4 |           4 | 2a4264fb-9f63-4d4f-9465-c1bc5440ea60 |
> Account
> > >   | NULL     |
> > > +----+--------------------------------------+-------+-------
> > > +-----------+------------+-------------+--------------------
> > > ------------------+---------------+----------+
> > > 2 rows in set (0.00 sec)
> > >
> > > Let me your thoughts and I'll fix it. Right now, obviously it's a bug.
> > >
> > >
> > >
> > > --
> > > With best regards, Ivan Kudryavtsev
> > > Bitworks Software, Ltd.
> > > Cell: +7-923-414-1515
> > > WWW: http://bitworks.software/ <http://bw-sw.com/>
> > >
> >
> >
> >
> > --
> > Rafael Weingärtner
> >
>
>
>
> --
> With best regards, Ivan Kudryavtsev
> Bitworks Software, Ltd.
> Cell: +7-923-414-1515
> WWW: http://bitworks.software/ <http://bw-sw.com/>
>



-- 
Rafael Weingärtner

Reply via email to