温曙光 <mailto:[email protected]>
October 29, 2015 at 6:53 AM
Dear all:
I use java api to access contrail config, but java api can't
deserialize VirtualRouter due to virtual_router_type's type doesn't
match between database and vnc_cfg.xsd.
test code: -------------->
package test_vrouter;
import java.io.IOException;
import net.juniper.contrail.api.ApiConnector;
import net.juniper.contrail.api.ApiConnectorFactory;
import net.juniper.contrail.api.types.VirtualRouter;
public class Test {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
ApiConnector api = ApiConnectorFactory.build("10.10.7.208",
8082)
.credentials("admin", "admin").tenantName("admin")
.authServer("keystone", "http://10.10.7.208:5000/v2.0");
VirtualRouter vr =
(VirtualRouter)api.findById(VirtualRouter.class,
"068f26d9-1704-4030-b1ed-6dee2a608d2d");
vr.setDisplayName("ubuntu208-1");
api.update(vr);
System.out.println(vr.toString());
}
}
exception stack: ------------>
Exception in thread "main" com.google.gson.JsonSyntaxException:
java.lang.IllegalStateException: Expected a string but was
BEGIN_ARRAY at line 1 column 179
at
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:176)
at com.google.gson.Gson.fromJson(Gson.java:803)
at com.google.gson.Gson.fromJson(Gson.java:768)
at com.google.gson.Gson.fromJson(Gson.java:717)
at com.google.gson.Gson.fromJson(Gson.java:689)
at
net.juniper.contrail.api.ApiSerializer.deserialize(ApiSerializer.java:52)
at
net.juniper.contrail.api.ApiBuilder.jsonToApiObject(ApiBuilder.java:66)
at
net.juniper.contrail.api.ApiConnectorImpl.findById(ApiConnectorImpl.java:500)
at test_vrouter.Test.main(Test.java:17)
Caused by: java.lang.IllegalStateException: Expected a string but was
BEGIN_ARRAY at line 1 column 179
at com.google.gson.stream.JsonReader.nextString(JsonReader.java:821)
at
com.google.gson.internal.bind.TypeAdapters$13.read(TypeAdapters.java:358)
at
com.google.gson.internal.bind.TypeAdapters$13.read(TypeAdapters.java:346)
at
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93)
at
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172)
... 8 more
the cause is Gson can't deserialize VirtualRouter from it's json
representation: ---------->
{"virtual-router": {"fq_name": ["default-global-system-config",
"ubuntu208"], "uuid": "068f26d9-1704-4030-b1ed-6dee2a608d2d",
"parent_uuid": "a15a4fed-d841-4bd0-bcb2-1de6e2d0cd69",
"virtual_router_type": [], "parent_href":
"http://10.10.7.208:8082/global-system-config/a15a4fed-d841-4bd0-bcb2-1de6e2d0cd69",
"parent_type": "global-system-config", "href":
"http://10.10.7.208:8082/virtual-router/068f26d9-1704-4030-b1ed-6dee2a608d2d",
"virtual_machine_refs": [{"to":
["default-domain__pro210__si_20fc5dda-9975-4dd1-aab5-215f60586533__1"],
"href":
"http://10.10.7.208:8082/virtual-machine/4605bc4d-78e5-4ab8-9696-06a5f7ee91ca",
"attr": null, "uuid": "4605bc4d-78e5-4ab8-9696-06a5f7ee91ca"}, {"to":
["default-domain", "pro23",
"default-domain__pro23__nfcloud_si_vrouter_1b95ab01-25bf-484f-b6bf-38169e63e383__1"],
"href":
"http://10.10.7.208:8082/virtual-machine/6c04d5df-6d1b-49f4-b4e3-56fa2bd8f7fb",
"attr": null, "uuid": "6c04d5df-6d1b-49f4-b4e3-56fa2bd8f7fb"}],
"id_perms": {"enable": true, "uuid": {"uuid_mslong":
472639199733104688, "uuid_lslong": 12821024583874284845}, "created":
"2015-09-17T08:30:46.870214", "description": null, "creator": null,
"user_visible": true, "last_modified": "2015-10-29T09:19:21.466210",
"permissions": {"owner": "admin", "owner_access": 7, "other_access":
7, "group": "KeystoneServiceAdmin", "group_access": 7}},
"display_name": "ubuntu208-1", "virtual_router_ip_address":
"10.10.7.208", "name": "ubuntu208"}}
the virtual_router_type is a empty array [], but it's declared as
String in vnc_cfg.xsd:---------->
966 <xsd:simpleType name="VirtualRouterType">
967 <xsd:restriction base="xsd:string">
968 <xsd:enumeration value="embedded"/>
969 <xsd:enumeration value="tor-agent"/>
970 <xsd:enumeration value="tor-service-node"/>
971 </xsd:restriction>
972 </xsd:simpleType>
973
974 <xsd:element name="virtual-router-type" type="VirtualRouterType"/>
975 <!--#IFMAP-SEMANTICS-IDL
976 Property('virtual-router-type', 'virtual-router') -->
and the generated java source decares virtual_router_type as String:
---------->
14 public class VirtualRouter extends ApiObjectBase {
15 private String virtual_router_type;
I change it to private List<String> virtual_router_type or just
remove it from Virtualrouter, the test code can succeed.
I digest into source code, and found that the virtual_router_type is
stored in cassandra as a list, and vnc_cfg_api_server doesn't touch it
And I find out that it's writed to from
./contrail-web-controller/webroot/config/physicaldevices/virtualrouters/ui/js/virtualrouters_config.js:
---------->
postObject["virtual-router"] = {};
postObject["virtual-router"]["fq_name"] =
["default-global-system-config", name];
postObject["virtual-router"]["parent_type"] =
"global-system-config";
postObject["virtual-router"]["name"] = name;
postObject["virtual-router"]["virtual_router_ip_address"] = ipAddress;
if(type != 'hypervisor' && type != '' && type != 'empty') {
postObject["virtual-router"]["virtual_router_type"] = [type];
} else {
postObject["virtual-router"]["virtual_router_type"] = [];
}
if(mode === 'edit') {
postObject["virtual-router"]["uuid"] = gblSelRow.uuid;
}
doAjaxCall(url, methodType, JSON.stringify(postObject),
'successHandlerForVirtualRouters',
'failureHandlerForCreateVirtualRouters', null, null);
Any body can fix it, or give some advise about how to fix it
I prefer to change vnc_cfg.xsd's VirtualRouterType to an string array
type, but I can't find a way to rewrite the xsd.
_______________________________________________
Dev mailing list
[email protected]
http://lists.opencontrail.org/mailman/listinfo/dev_lists.opencontrail.org