Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

"Field is not searchable" when getting record with EA #48

Open
sjberman opened this issue Mar 14, 2018 · 15 comments
Open

"Field is not searchable" when getting record with EA #48

sjberman opened this issue Mar 14, 2018 · 15 comments

Comments

@sjberman
Copy link

sjberman commented Mar 14, 2018

I'm attempting to get a record (either A or CNAME, using GetObject), by specifying an object like this:

	obj := ibclient.NewRecordA(
		ibclient.RecordA{
			Name:     "foo.com",
			Ipv4Addr: "1.2.3.4",
			View:     "default",
			Ea:      ibclient.EA{eaKey: eaVal},
		},
	)

The body of the HTTP request that gets constructed looks like this;

'{"ipv4addr":"1.2.3.4","name":"foo.com","view":"default","extattrs":{"My-EA":{"value":"testing"}}}'

However, I'm getting this error:

{ "Error": "AdmConProtoError: Field is not searchable: extattrs",
  "code": "Client.Ibap.Proto",
  "text": "Field is not searchable: extattrs"
}

The extattrs are not searchable. I need them to be, as all of the objects I create will have "My-EA", and at a certain point I'll have a general GetObject call to get all objects that I've created (by using the EA as my search pattern), and nothing more. Is this possible?

@chinmayb chinmayb self-assigned this Mar 16, 2018
@chinmayb
Copy link
Contributor

You'll have to use 'eaSearch' while creating RecordA object

@sjberman
Copy link
Author

Can you provide an example? I'm not sure what you mean.

@sjberman
Copy link
Author

If you're referring to setting the obj.eaSearch to something, the field is not exported, so I don't have access to setting the variable.

@chinmayb
Copy link
Contributor

chinmayb commented Mar 17, 2018

I'll raise a PR soon

Corresponding WAPI URL would look like :

/v2.7/record:a?*<eakey>:=<eavalue>

@sjberman
Copy link
Author

Thanks.

I did try to adjust the URL to have the EAKey and EAvalue in it (similar to how you mentioned), but it returned every object with the EA, and seemed to ignore the http body which had the details about the specific object I wanted. In this case I then had to loop through all those objects until I got the one that I cared about.

@chinmayb
Copy link
Contributor

PR Raised #49
Can you check whether that works for you ?

@sjberman
Copy link
Author

sjberman commented Mar 19, 2018

In briefly glancing at the code, I see a few things.

  1. I need to be able to get both A and CNAME records.
  2. The method you added, GetRecordA, accepts an EA and returns all A records. Which means I'll have to parse through and find the one I want (unless I want all of them, which I do in some cases). One of the nice things about the current GetObject method is that I can specify an A or CNAME record with specific fields, and I'll get back just that record. Being able to simply add an EA to the object I've constructed, and calling GetObject on that should return just that object.

Ideally I would like to be able to construct an A/CNAME record like the one above, and call GetObject and just get that object, or I could also construct an object like this:

obj := ibclient.NewRecordA(
		ibclient.RecordA{
			View:     "default",
			Ea:      ibclient.EA{eaKey: eaVal},
		},
	)

and get all A records in the "default" view with my EA, by using GetObject on that. This is the current way of getting objects without specifying an EA.

@chinmayb
Copy link
Contributor

chinmayb commented Mar 19, 2018

The method you added, GetRecordA, accepts an EA and returns all A records.

It returns all A records with the associated EA tag. You just have to pass it to the GetRecordA method, if not it will return all the A records

@sjberman
Copy link
Author

Right, I meant it returns all A records with the EA. What I would like is to simply call GetObject with an A/CNAME record that has an EA in its spec (along with other fields), and just get that single object back. That way I don't need to parse through all the returned objects to try and find the one that I wanted. Also, if I wanted to, I could create some generic A record like the one in my last comment, still use GetObject on it, and that would return me multiple A records. That is how I am currently using GetObject, it simply returns any objects that match the constructed object I passed in.

@yuewko
Copy link
Contributor

yuewko commented Mar 20, 2018

@chinmayb , have you tried implementing GetRecordA() in a similar fashion as GetNetwork()? i.e. allow GetRecordA() to pass in commonly used search parameters such as netview, name, ipaddr etc, in addition to EA?

@sjberman
Copy link
Author

sjberman commented Mar 20, 2018

Ideally what I would prefer is to continue using GetObject. It is convenient in that I can construct any record (A or CNAME), with whatever fields I want, and it will return to me any objects (or a single object) that match my passed in record. The enhancement that I'm asking for is to also be able to provide an EA
field in the record that I pass to GetObject (maybe this is as simple as setting the EASearch field while in the GetObject method).

@yuewko
Copy link
Contributor

yuewko commented Mar 20, 2018

@sjberman Yes, that would be the way to do it. I haven't been working on this code for a while, so @chinmayb please see what the implication is.

So, basically, what we can do is, instead of doing, for example, the following in the GetNetwork() method:

    if ea != nil && len(ea) > 0 {                                                               
        network.eaSearch = EASearch(ea)                                                         
    }

move that functionality into the GetObject() method.

@chinmayb
Copy link
Contributor

chinmayb commented Mar 21, 2018

@sjberman @yuewko should be doable. Will have a look at it as soon as I get some spare time.

@chinmayb
Copy link
Contributor

chinmayb commented Apr 2, 2018

For some objects EA field wouldnt be there. I feel why not use SetEaSearch field (which i included in the latest PR) explicitly to set the EAs ?

@yuewko
Copy link
Contributor

yuewko commented Apr 3, 2018

Based on the comment #48 (comment), the expectation is to be able to construct an object with the desired search fields, and pass that to GetObject() to perform search accordingly.

If EA field is set, the GetObject() method should recognize it and set eaSearch field accordingly.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants