Initial OpenECOMP MSO OpenStack SDK lib commit 47/5547/3
authorChrisC <cc697w@intl.att.com>
Tue, 31 Jan 2017 12:57:24 +0000 (13:57 +0100)
committerChrisC <cc697w@intl.att.com>
Tue, 31 Jan 2017 13:55:11 +0000 (14:55 +0100)
Change-Id: Ieaacb2b2c0dcc469669880e73f0cda9fa59a6c5a
Signed-off-by: ChrisC <cc697w@intl.att.com>
313 files changed:
.gitignore [new file with mode: 0644]
.gitreview [new file with mode: 0644]
LICENSE.txt [new file with mode: 0644]
README.textile [new file with mode: 0644]
bundle.sh [new file with mode: 0644]
ceilometer-client/pom.xml [new file with mode: 0644]
ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/Ceilometer.java [new file with mode: 0644]
ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/QueriableCeilometerCommand.java [new file with mode: 0644]
ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/v2/api/MetersResource.java [new file with mode: 0644]
ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/v2/api/ResourcesResource.java [new file with mode: 0644]
ceilometer-model/pom.xml [new file with mode: 0644]
ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Meter.java [new file with mode: 0644]
ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Resource.java [new file with mode: 0644]
ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Sample.java [new file with mode: 0644]
ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Statistics.java [new file with mode: 0644]
glance-client/pom.xml [new file with mode: 0644]
glance-client/src/main/java/com/woorea/openstack/glance/Glance.java [new file with mode: 0644]
glance-client/src/main/java/com/woorea/openstack/glance/ImagesResource.java [new file with mode: 0644]
glance-client/src/main/java/com/woorea/openstack/glance/SharedImagesResource.java [new file with mode: 0644]
glance-model/pom.xml [new file with mode: 0644]
glance-model/src/main/java/com/woorea/openstack/glance/model/Image.java [new file with mode: 0644]
glance-model/src/main/java/com/woorea/openstack/glance/model/ImageDownload.java [new file with mode: 0644]
glance-model/src/main/java/com/woorea/openstack/glance/model/ImageMember.java [new file with mode: 0644]
glance-model/src/main/java/com/woorea/openstack/glance/model/ImageMembers.java [new file with mode: 0644]
glance-model/src/main/java/com/woorea/openstack/glance/model/ImageUpload.java [new file with mode: 0644]
glance-model/src/main/java/com/woorea/openstack/glance/model/Images.java [new file with mode: 0644]
glance-model/src/main/java/com/woorea/openstack/glance/model/SharedImage.java [new file with mode: 0644]
glance-model/src/main/java/com/woorea/openstack/glance/model/SharedImages.java [new file with mode: 0644]
heat-client/pom.xml [new file with mode: 0644]
heat-client/src/main/java/com/woorea/openstack/heat/Heat.java [new file with mode: 0644]
heat-client/src/main/java/com/woorea/openstack/heat/ResourcesResource.java [new file with mode: 0644]
heat-client/src/main/java/com/woorea/openstack/heat/StackResource.java [new file with mode: 0644]
heat-model/pom.xml [new file with mode: 0644]
heat-model/src/main/java/com/woorea/openstack/heat/model/CreateStackParam.java [new file with mode: 0644]
heat-model/src/main/java/com/woorea/openstack/heat/model/Explanation.java [new file with mode: 0644]
heat-model/src/main/java/com/woorea/openstack/heat/model/Link.java [new file with mode: 0644]
heat-model/src/main/java/com/woorea/openstack/heat/model/Resource.java [new file with mode: 0644]
heat-model/src/main/java/com/woorea/openstack/heat/model/Resources.java [new file with mode: 0644]
heat-model/src/main/java/com/woorea/openstack/heat/model/Stack.java [new file with mode: 0644]
heat-model/src/main/java/com/woorea/openstack/heat/model/Stacks.java [new file with mode: 0644]
heat-model/src/main/java/com/woorea/openstack/heat/model/UpdateStackParam.java [new file with mode: 0644]
keystone-client/pom.xml [new file with mode: 0644]
keystone-client/src/main/java/com/woorea/openstack/keystone/Keystone.java [new file with mode: 0644]
keystone-client/src/main/java/com/woorea/openstack/keystone/api/EndpointsResource.java [new file with mode: 0644]
keystone-client/src/main/java/com/woorea/openstack/keystone/api/RolesResource.java [new file with mode: 0644]
keystone-client/src/main/java/com/woorea/openstack/keystone/api/ServicesResource.java [new file with mode: 0644]
keystone-client/src/main/java/com/woorea/openstack/keystone/api/TenantsResource.java [new file with mode: 0644]
keystone-client/src/main/java/com/woorea/openstack/keystone/api/TokensResource.java [new file with mode: 0644]
keystone-client/src/main/java/com/woorea/openstack/keystone/api/UsersResource.java [new file with mode: 0644]
keystone-client/src/main/java/com/woorea/openstack/keystone/utils/KeystoneTokenProvider.java [new file with mode: 0644]
keystone-client/src/main/java/com/woorea/openstack/keystone/utils/KeystoneUtils.java [new file with mode: 0644]
keystone-client/src/main/java/com/woorea/openstack/keystone/v3/Keystone.java [new file with mode: 0644]
keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/CredentialsResources.java [new file with mode: 0644]
keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/DomainGroupRolesResource.java [new file with mode: 0644]
keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/DomainUserRolesResource.java [new file with mode: 0644]
keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/DomainsResource.java [new file with mode: 0644]
keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/EndpointsResource.java [new file with mode: 0644]
keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/GenericResource.java [new file with mode: 0644]
keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/GroupUsersResource.java [new file with mode: 0644]
keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/GroupsResource.java [new file with mode: 0644]
keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/PoliciesResource.java [new file with mode: 0644]
keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/ProjectGroupRolesResource.java [new file with mode: 0644]
keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/ProjectRolesResource.java [new file with mode: 0644]
keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/ProjectUserRolesResource.java [new file with mode: 0644]
keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/ProjectsResource.java [new file with mode: 0644]
keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/RolesResource.java [new file with mode: 0644]
keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/ServicesResource.java [new file with mode: 0644]
keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/TokensResource.java [new file with mode: 0644]
keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/UsersResource.java [new file with mode: 0644]
keystone-model/pom.xml [new file with mode: 0644]
keystone-model/src/main/java/com/woorea/openstack/keystone/model/Access.java [new file with mode: 0644]
keystone-model/src/main/java/com/woorea/openstack/keystone/model/Authentication.java [new file with mode: 0644]
keystone-model/src/main/java/com/woorea/openstack/keystone/model/Endpoint.java [new file with mode: 0644]
keystone-model/src/main/java/com/woorea/openstack/keystone/model/Endpoints.java [new file with mode: 0644]
keystone-model/src/main/java/com/woorea/openstack/keystone/model/Error.java [new file with mode: 0644]
keystone-model/src/main/java/com/woorea/openstack/keystone/model/Link.java [new file with mode: 0644]
keystone-model/src/main/java/com/woorea/openstack/keystone/model/Metadata.java [new file with mode: 0644]
keystone-model/src/main/java/com/woorea/openstack/keystone/model/Role.java [new file with mode: 0644]
keystone-model/src/main/java/com/woorea/openstack/keystone/model/Roles.java [new file with mode: 0644]
keystone-model/src/main/java/com/woorea/openstack/keystone/model/Service.java [new file with mode: 0644]
keystone-model/src/main/java/com/woorea/openstack/keystone/model/Services.java [new file with mode: 0644]
keystone-model/src/main/java/com/woorea/openstack/keystone/model/Tenant.java [new file with mode: 0644]
keystone-model/src/main/java/com/woorea/openstack/keystone/model/Tenants.java [new file with mode: 0644]
keystone-model/src/main/java/com/woorea/openstack/keystone/model/Token.java [new file with mode: 0644]
keystone-model/src/main/java/com/woorea/openstack/keystone/model/User.java [new file with mode: 0644]
keystone-model/src/main/java/com/woorea/openstack/keystone/model/Users.java [new file with mode: 0644]
keystone-model/src/main/java/com/woorea/openstack/keystone/model/authentication/AccessKey.java [new file with mode: 0644]
keystone-model/src/main/java/com/woorea/openstack/keystone/model/authentication/RackspaceAuthentication.java [new file with mode: 0644]
keystone-model/src/main/java/com/woorea/openstack/keystone/model/authentication/TokenAuthentication.java [new file with mode: 0644]
keystone-model/src/main/java/com/woorea/openstack/keystone/model/authentication/UsernamePassword.java [new file with mode: 0644]
keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Authentication.java [new file with mode: 0644]
keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Credential.java [new file with mode: 0644]
keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Credentials.java [new file with mode: 0644]
keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Domain.java [new file with mode: 0644]
keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Domains.java [new file with mode: 0644]
keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Endpoint.java [new file with mode: 0644]
keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Endpoints.java [new file with mode: 0644]
keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Group.java [new file with mode: 0644]
keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Groups.java [new file with mode: 0644]
keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Policies.java [new file with mode: 0644]
keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Policy.java [new file with mode: 0644]
keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Project.java [new file with mode: 0644]
keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Projects.java [new file with mode: 0644]
keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Role.java [new file with mode: 0644]
keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Roles.java [new file with mode: 0644]
keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Service.java [new file with mode: 0644]
keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Services.java [new file with mode: 0644]
keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Token.java [new file with mode: 0644]
keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/User.java [new file with mode: 0644]
keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Users.java [new file with mode: 0644]
nova-client/pom.xml [new file with mode: 0644]
nova-client/src/main/java/com/woorea/openstack/nova/Nova.java [new file with mode: 0644]
nova-client/src/main/java/com/woorea/openstack/nova/api/ExtensionsResource.java [new file with mode: 0644]
nova-client/src/main/java/com/woorea/openstack/nova/api/FlavorsResource.java [new file with mode: 0644]
nova-client/src/main/java/com/woorea/openstack/nova/api/ImagesResource.java [new file with mode: 0644]
nova-client/src/main/java/com/woorea/openstack/nova/api/QuotaSetsResource.java [new file with mode: 0644]
nova-client/src/main/java/com/woorea/openstack/nova/api/ServersResource.java [new file with mode: 0644]
nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/AggregatesExtension.java [new file with mode: 0644]
nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/CloudpipesExtension.java [new file with mode: 0644]
nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/CredentialsExtension.java [new file with mode: 0644]
nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/FloatingIpDnsExtension.java [new file with mode: 0644]
nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/FloatingIpPoolsExtension.java [new file with mode: 0644]
nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/FloatingIpsExtension.java [new file with mode: 0644]
nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/HostsExtension.java [new file with mode: 0644]
nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/HypervisorsExtension.java [new file with mode: 0644]
nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/KeyPairsExtension.java [new file with mode: 0644]
nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/NetworksExtension.java [new file with mode: 0644]
nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/SecurityGroupsExtension.java [new file with mode: 0644]
nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/SnapshotsExtension.java [new file with mode: 0644]
nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/VolumesExtension.java [new file with mode: 0644]
nova-model/pom.xml [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/Certificate.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/Cloudpipe.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/Cloudpipes.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/Extension.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/Extensions.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/Flavor.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/FlavorForCreate.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/Flavors.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/FloatingIp.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/FloatingIpDomain.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/FloatingIpDomains.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/FloatingIpPools.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/FloatingIps.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/Host.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/HostAggregate.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/HostAggregates.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/Hosts.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/Image.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/ImageFromVolume.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/Images.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/KeyPair.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/KeyPairs.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/Limits.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/Link.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/Metadata.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/Network.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/NetworkForCreate.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/Networks.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/PersonalityFile.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/QuotaSet.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/SecurityGroup.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/SecurityGroupForCreate.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/SecurityGroupRuleForCreate.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/SecurityGroups.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/Server.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/ServerAction.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/ServerForCreate.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/Servers.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/SimpleTenantUsage.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/SimpleTenantUsages.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/Snapshot.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/SnapshotForCreate.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/Snapshots.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/Volume.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/VolumeAttachment.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/VolumeAttachments.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/VolumeForCreate.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/VolumeForImageCreate.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/VolumeType.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/VolumeTypes.java [new file with mode: 0644]
nova-model/src/main/java/com/woorea/openstack/nova/model/Volumes.java [new file with mode: 0644]
openstack-client-connectors/http-connector/pom.xml [new file with mode: 0644]
openstack-client-connectors/http-connector/src/main/java/com/woorea/openstack/connector/HttpClientConnector.java [new file with mode: 0644]
openstack-client-connectors/http-connector/src/main/java/com/woorea/openstack/connector/HttpClientException.java [new file with mode: 0644]
openstack-client-connectors/http-connector/src/main/java/com/woorea/openstack/connector/HttpClientRedirectStrategy.java [new file with mode: 0644]
openstack-client-connectors/http-connector/src/main/java/com/woorea/openstack/connector/HttpClientResponse.java [new file with mode: 0644]
openstack-client-connectors/http-connector/src/main/resources/META-INF/services/com.woorea.openstack.base.client.OpenStackClientConnector [new file with mode: 0644]
openstack-client-connectors/jersey-connector/pom.xml [new file with mode: 0644]
openstack-client-connectors/jersey-connector/src/main/java/com/woorea/openstack/connector/JerseyConnector.java [new file with mode: 0644]
openstack-client-connectors/jersey-connector/src/main/java/com/woorea/openstack/connector/JerseyLoggingFilter.java [new file with mode: 0644]
openstack-client-connectors/jersey-connector/src/main/java/com/woorea/openstack/connector/JerseyResponse.java [new file with mode: 0644]
openstack-client-connectors/jersey-connector/src/main/resources/META-INF/services/com.woorea.openstack.base.client.OpenStackClientConnector [new file with mode: 0644]
openstack-client-connectors/jersey2-connector/pom.xml [new file with mode: 0644]
openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/connector/JaxRs20Connector.java [new file with mode: 0644]
openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/connector/JaxRs20Response.java [new file with mode: 0644]
openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/connector/OpenStack.java [new file with mode: 0644]
openstack-client-connectors/jersey2-connector/src/main/resources/META-INF/services/com.woorea.openstack.base.client.OpenStackClientConnector [new file with mode: 0644]
openstack-client-connectors/pom.xml [new file with mode: 0644]
openstack-client-connectors/resteasy-connector/pom.xml [new file with mode: 0644]
openstack-client-connectors/resteasy-connector/src/main/java/com/woorea/openstack/connector/RESTEasyConnector.java [new file with mode: 0644]
openstack-client-connectors/resteasy-connector/src/main/java/com/woorea/openstack/connector/RESTEasyInputStream.java [new file with mode: 0644]
openstack-client-connectors/resteasy-connector/src/main/java/com/woorea/openstack/connector/RESTEasyResponse.java [new file with mode: 0644]
openstack-client-connectors/resteasy-connector/src/main/resources/META-INF/services/com.woorea.openstack.base.client.OpenStackClientConnector [new file with mode: 0644]
openstack-client/pom.xml [new file with mode: 0644]
openstack-client/src/main/java/com/woorea/openstack/base/client/Entity.java [new file with mode: 0644]
openstack-client/src/main/java/com/woorea/openstack/base/client/HttpMethod.java [new file with mode: 0644]
openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackBaseException.java [new file with mode: 0644]
openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackClient.java [new file with mode: 0644]
openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackClientConnector.java [new file with mode: 0644]
openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackCommand.java [new file with mode: 0644]
openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackConnectException.java [new file with mode: 0644]
openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackRequest.java [new file with mode: 0644]
openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackResponse.java [new file with mode: 0644]
openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackResponseException.java [new file with mode: 0644]
openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackResponseStatus.java [new file with mode: 0644]
openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackSimpleTokenProvider.java [new file with mode: 0644]
openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackTokenProvider.java [new file with mode: 0644]
openstack-client/src/main/java/com/woorea/openstack/common/client/AbstractOpenStackClient.java [new file with mode: 0644]
openstack-client/src/main/java/com/woorea/openstack/common/session/OpenStackSession.java [new file with mode: 0644]
openstack-client/src/main/java/com/woorea/openstack/common/session/OpenStackSessionHolder.java [new file with mode: 0644]
openstack-console/pom.xml [new file with mode: 0644]
openstack-console/src/main/java/com/woorea/openstack/console/Command.java [new file with mode: 0644]
openstack-console/src/main/java/com/woorea/openstack/console/CommandLineHelper.java [new file with mode: 0644]
openstack-console/src/main/java/com/woorea/openstack/console/Commands.java [new file with mode: 0644]
openstack-console/src/main/java/com/woorea/openstack/console/Console.java [new file with mode: 0644]
openstack-console/src/main/java/com/woorea/openstack/console/Environment.java [new file with mode: 0644]
openstack-console/src/main/java/com/woorea/openstack/console/Main.java [new file with mode: 0644]
openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneCommand.java [new file with mode: 0644]
openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneEnvironment.java [new file with mode: 0644]
openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneRoleCreate.java [new file with mode: 0644]
openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneRoleDelete.java [new file with mode: 0644]
openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneRoleList.java [new file with mode: 0644]
openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneServiceList.java [new file with mode: 0644]
openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneTenantCreate.java [new file with mode: 0644]
openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneTenantDelete.java [new file with mode: 0644]
openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneTenantList.java [new file with mode: 0644]
openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneUserCreate.java [new file with mode: 0644]
openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneUserDelete.java [new file with mode: 0644]
openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneUserList.java [new file with mode: 0644]
openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneUserShow.java [new file with mode: 0644]
openstack-console/src/main/java/com/woorea/openstack/console/nova/NovaCommand.java [new file with mode: 0644]
openstack-console/src/main/java/com/woorea/openstack/console/nova/NovaEnvironment.java [new file with mode: 0644]
openstack-console/src/main/java/com/woorea/openstack/console/nova/NovaServerList.java [new file with mode: 0644]
openstack-console/src/main/java/com/woorea/openstack/console/utils/Column.java [new file with mode: 0644]
openstack-console/src/main/java/com/woorea/openstack/console/utils/ConsoleUtils.java [new file with mode: 0644]
openstack-console/src/main/java/com/woorea/openstack/console/utils/Table.java [new file with mode: 0644]
openstack-console/src/main/java/com/woorea/openstack/console/utils/TableModel.java [new file with mode: 0644]
openstack-console/src/main/resources/console.properties [new file with mode: 0644]
openstack-examples/pom.xml [new file with mode: 0644]
openstack-examples/src/main/java/com/woorea/openstack/examples/ExamplesConfiguration.java [new file with mode: 0644]
openstack-examples/src/main/java/com/woorea/openstack/examples/compute/NovaCreateServer.java [new file with mode: 0644]
openstack-examples/src/main/java/com/woorea/openstack/examples/compute/NovaListFlavors.java [new file with mode: 0644]
openstack-examples/src/main/java/com/woorea/openstack/examples/compute/NovaListImages.java [new file with mode: 0644]
openstack-examples/src/main/java/com/woorea/openstack/examples/compute/NovaListServers.java [new file with mode: 0644]
openstack-examples/src/main/java/com/woorea/openstack/examples/compute/NovaStopStartServer.java [new file with mode: 0644]
openstack-examples/src/main/java/com/woorea/openstack/examples/glance/GlanceListImages.java [new file with mode: 0644]
openstack-examples/src/main/java/com/woorea/openstack/examples/heat/HeatListStacks.java [new file with mode: 0644]
openstack-examples/src/main/java/com/woorea/openstack/examples/hpcloud/Keystone3Authentication.java [new file with mode: 0644]
openstack-examples/src/main/java/com/woorea/openstack/examples/hpcloud/KeystoneAuthentication.java [new file with mode: 0644]
openstack-examples/src/main/java/com/woorea/openstack/examples/keystone/KeystoneCreateTenant.java [new file with mode: 0644]
openstack-examples/src/main/java/com/woorea/openstack/examples/keystone/KeystoneCreateUser.java [new file with mode: 0644]
openstack-examples/src/main/java/com/woorea/openstack/examples/metering/v2/TestAll.java [new file with mode: 0644]
openstack-examples/src/main/java/com/woorea/openstack/examples/network/QuantumListNetworks.java [new file with mode: 0644]
openstack-examples/src/main/java/com/woorea/openstack/examples/network/QuantumNetworkCreate.java [new file with mode: 0644]
openstack-examples/src/main/java/com/woorea/openstack/examples/network/QuantumQueryNetworks.java [new file with mode: 0644]
openstack-examples/src/main/java/com/woorea/openstack/examples/objectstore/SwiftExample.java [new file with mode: 0644]
openstack-examples/src/main/java/com/woorea/openstack/examples/simple/OpenStackSimpleClient.java [new file with mode: 0644]
openstack-java-sdk-master/.travis.yml [new file with mode: 0644]
pom.xml [new file with mode: 0644]
project-configs/maven/conf/settings.xml [new file with mode: 0644]
quantum-client/pom.xml [new file with mode: 0644]
quantum-client/src/main/java/com/woorea/openstack/quantum/Quantum.java [new file with mode: 0644]
quantum-client/src/main/java/com/woorea/openstack/quantum/api/NetworksResource.java [new file with mode: 0644]
quantum-client/src/main/java/com/woorea/openstack/quantum/api/PortsResource.java [new file with mode: 0644]
quantum-client/src/main/java/com/woorea/openstack/quantum/api/RoutersResource.java [new file with mode: 0644]
quantum-client/src/main/java/com/woorea/openstack/quantum/api/SubnetsResource.java [new file with mode: 0644]
quantum-client/src/main/java/com/woorea/openstack/quantum/api/query/AbsOpenStackCmd.java [new file with mode: 0644]
quantum-model/pom.xml [new file with mode: 0644]
quantum-model/src/main/java/com/woorea/openstack/quantum/model/GatewayInfo.java [new file with mode: 0644]
quantum-model/src/main/java/com/woorea/openstack/quantum/model/HostRoute.java [new file with mode: 0644]
quantum-model/src/main/java/com/woorea/openstack/quantum/model/Network.java [new file with mode: 0644]
quantum-model/src/main/java/com/woorea/openstack/quantum/model/NetworkForCreate.java [new file with mode: 0644]
quantum-model/src/main/java/com/woorea/openstack/quantum/model/Networks.java [new file with mode: 0644]
quantum-model/src/main/java/com/woorea/openstack/quantum/model/NeutronError.java [new file with mode: 0644]
quantum-model/src/main/java/com/woorea/openstack/quantum/model/Pool.java [new file with mode: 0644]
quantum-model/src/main/java/com/woorea/openstack/quantum/model/Port.java [new file with mode: 0644]
quantum-model/src/main/java/com/woorea/openstack/quantum/model/PortForCreate.java [new file with mode: 0644]
quantum-model/src/main/java/com/woorea/openstack/quantum/model/Ports.java [new file with mode: 0644]
quantum-model/src/main/java/com/woorea/openstack/quantum/model/Router.java [new file with mode: 0644]
quantum-model/src/main/java/com/woorea/openstack/quantum/model/RouterForAddInterface.java [new file with mode: 0644]
quantum-model/src/main/java/com/woorea/openstack/quantum/model/RouterForCreate.java [new file with mode: 0644]
quantum-model/src/main/java/com/woorea/openstack/quantum/model/RouterInterface.java [new file with mode: 0644]
quantum-model/src/main/java/com/woorea/openstack/quantum/model/Routers.java [new file with mode: 0644]
quantum-model/src/main/java/com/woorea/openstack/quantum/model/Segment.java [new file with mode: 0644]
quantum-model/src/main/java/com/woorea/openstack/quantum/model/Subnet.java [new file with mode: 0644]
quantum-model/src/main/java/com/woorea/openstack/quantum/model/SubnetForCreate.java [new file with mode: 0644]
quantum-model/src/main/java/com/woorea/openstack/quantum/model/Subnets.java [new file with mode: 0644]
quantum-model/src/test/java/com/woorea/openstack/quantum/model/NetworkTest.java [new file with mode: 0644]
quantum-model/src/test/java/com/woorea/openstack/quantum/model/PortTest.java [new file with mode: 0644]
quantum-model/src/test/java/com/woorea/openstack/quantum/model/SubnetTest.java [new file with mode: 0644]
swift-client/pom.xml [new file with mode: 0644]
swift-client/src/main/java/com/woorea/openstack/swift/Swift.java [new file with mode: 0644]
swift-client/src/main/java/com/woorea/openstack/swift/api/AccountResource.java [new file with mode: 0644]
swift-client/src/main/java/com/woorea/openstack/swift/api/ContainerResource.java [new file with mode: 0644]
swift-client/src/main/java/com/woorea/openstack/swift/api/ContainersResource.java [new file with mode: 0644]
swift-model/pom.xml [new file with mode: 0644]
swift-model/src/main/java/com/woorea/openstack/swift/model/Account.java [new file with mode: 0644]
swift-model/src/main/java/com/woorea/openstack/swift/model/Container.java [new file with mode: 0644]
swift-model/src/main/java/com/woorea/openstack/swift/model/Object.java [new file with mode: 0644]
swift-model/src/main/java/com/woorea/openstack/swift/model/ObjectDownload.java [new file with mode: 0644]
swift-model/src/main/java/com/woorea/openstack/swift/model/ObjectForUpload.java [new file with mode: 0644]
version.properties [new file with mode: 0644]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..0aab431
--- /dev/null
@@ -0,0 +1,8 @@
+target
+.settings
+.classpath
+.project
+.buildpath
+.idea
+*.iml
+
diff --git a/.gitreview b/.gitreview
new file mode 100644 (file)
index 0000000..8fd309d
--- /dev/null
@@ -0,0 +1,4 @@
+[gerrit]
+host=gerrit.openecomp.org
+port=29418
+project=mso/libs.git
diff --git a/LICENSE.txt b/LICENSE.txt
new file mode 100644 (file)
index 0000000..d645695
--- /dev/null
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/README.textile b/README.textile
new file mode 100644 (file)
index 0000000..ff07ffa
--- /dev/null
@@ -0,0 +1,142 @@
+h1. OpenStack Java SDK v2.0
+
+h1. Important
+
+You can continue using the latest source from v1.x essex branch
+
+h2. Maven
+
+|groupId|artifactId|version|
+|com.woorea|keystone-client|3.0.0-SNAPSHOT|
+|com.woorea|nova-client|3.0.0-SNAPSHOT|
+|com.woorea|glance-client|3.0.0-SNAPSHOT|
+|com.woorea|swift-client|3.0.0-SNAPSHOT|
+
+h3. Maven Repositories
+
+https://maven.java.net/content/repositories/snapshots
+https://raw.github.com/woorea/maven/master/snapshots
+
+h1. Available artifacts
+
+h2. OpenStack Identity Service
+
+OpenStack Keystone Model
+
+OpenStack Keystone Client
+
+<pre>
+KeystoneClient keystone = new KeystoneClient(KEYSTONE_AUTH_URL);
+Authentication authentication = new Authentication();
+PasswordCredentials passwordCredentials = new PasswordCredentials();
+passwordCredentials.setUsername(KEYSTONE_USERNAME);
+passwordCredentials.setPassword(KEYSTONE_PASSWORD);
+authentication.setPasswordCredentials(passwordCredentials);
+
+//access with unscoped token
+Access access = keystone.execute(new Authenticate(authentication));
+
+//use the token in the following requests
+keystone.setToken(access.getToken().getId());
+
+Tenants tenants = keystone.execute(new ListTenants());
+
+//try to exchange token using the first tenant
+if(tenants.getList().size() > 0) {
+       
+       authentication = new Authentication();
+       Token token = new Token();
+       token.setId(access.getToken().getId());
+       authentication.setToken(token);
+       authentication.setTenantId(tenants.getList().get(0).getId());
+       
+       access = keystone.execute(new Authenticate(authentication));
+       
+       ...
+</pre>
+
+h2. OpenStack Compute Service
+
+OpenStack Nova Model
+
+OpenStack Nova Client
+
+<pre>
+NovaClient novaClient = new NovaClient(KeystoneUtils.findEndpointURL(access.getServiceCatalog(), "compute", null, "public"), access.getToken().getId());
+                       
+Servers servers = novaClient.execute(ServersCore.listServers());
+for(Server server : servers) {
+       System.out.println(server);
+}
+</pre>
+
+h2. OpenStack Image Store Service
+
+OpenStack Glance Model
+
+OpenStack Glance Client
+
+h2. OpenStack Object Store Service
+
+OpenStack Swift Model
+
+OpenStack Swift Client
+
+h2. OpenStack Ceilometer Service
+
+h3. MongoDB Installation
+
+OpenStack Ceilometer Service uses MongoDB as storage.
+
+h3. Ceilometer Compute Agent Installation
+
+OpenStack Ceilometer Compute Agent
+
+This artefact should be installed on each compute node
+
+<pre>
+mvn clean compile assembly:assembly
+Properties can be configured in /etc/ceilometer/ceilometer-agent.properties
+java -jar ceilometer-compute-agent-jar-with-dependencies.jar 
+</pre>
+
+h3. Ceilometer Collector Installation
+
+OpenStack Ceilometer Collector
+
+<pre>
+mvn clean compile assembly:assembly
+Properties can be configured in /etc/ceilometer/ceilometer-collector.properties
+java -jar ceilometer-collector.jar 
+</pre>
+
+h3. OpenStack Ceilometer API Installation
+
+OpenStack Ceilometer API
+
+<pre>
+mvn clean compile assembly:assembly
+Properties can be configured in /etc/ceilometer/ceilometer-api.properties
+java -jar ceilometer-api.jar 
+</pre>
+OpenStack Ceilometer Client
+
+h1. License
+
+<pre>
+This software is licensed under the Apache 2 license, quoted below.
+
+Copyright 2012 Luis Gervaso and OpenStack Java SDK
+
+Licensed under the Apache License, Version 2.0 (the "License"); you may not
+use this file except in compliance with the License. You may obtain a copy of
+the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+License for the specific language governing permissions and limitations under
+the License.
+</pre>
\ No newline at end of file
diff --git a/bundle.sh b/bundle.sh
new file mode 100644 (file)
index 0000000..bae5155
--- /dev/null
+++ b/bundle.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+mvn source:jar javadoc:jar package gpg:sign repository:bundle-create -Dgpg.passphrase=$1
\ No newline at end of file
diff --git a/ceilometer-client/pom.xml b/ceilometer-client/pom.xml
new file mode 100644 (file)
index 0000000..e3deb68
--- /dev/null
@@ -0,0 +1,24 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+       <modelVersion>4.0.0</modelVersion>
+       <parent>
+               <groupId>org.openecomp.mso.libs</groupId>
+               <artifactId>openstack-java-sdk</artifactId>
+               <version>1.0.0-SNAPSHOT</version>
+       </parent>
+       <groupId>org.openecomp.mso.libs.openstack-java-sdk</groupId>
+       <artifactId>ceilometer-client</artifactId>
+       <name>OpenStack Ceilometer Client</name>
+       <description>OpenStack Ceilometer Client</description>
+       <dependencies>
+               <dependency>
+                       <groupId>org.openecomp.mso.libs.openstack-java-sdk</groupId>
+                       <artifactId>openstack-client</artifactId>
+                       <version>1.0.0-SNAPSHOT</version>
+               </dependency>
+               <dependency>
+                       <groupId>org.openecomp.mso.libs.openstack-java-sdk</groupId>
+                       <artifactId>ceilometer-model</artifactId>
+                       <version>1.0.0-SNAPSHOT</version>
+               </dependency>
+       </dependencies>
+</project>
diff --git a/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/Ceilometer.java b/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/Ceilometer.java
new file mode 100644 (file)
index 0000000..05cda35
--- /dev/null
@@ -0,0 +1,34 @@
+package com.woorea.openstack.ceilometer;
+
+
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackClientConnector;
+import com.woorea.openstack.ceilometer.v2.api.MetersResource;
+import com.woorea.openstack.ceilometer.v2.api.ResourcesResource;
+
+public class Ceilometer extends OpenStackClient {
+       
+       private final MetersResource METERS;
+       
+       private final ResourcesResource RESOURCES;
+       
+       public Ceilometer(String endpoint, OpenStackClientConnector connector) {
+               super(endpoint, connector);
+               METERS = new MetersResource(this);
+               RESOURCES = new ResourcesResource(this);
+       }
+       
+       public Ceilometer(String endpoint) {
+               this(endpoint, null);
+               
+       }
+       
+       public ResourcesResource resources() {
+               return RESOURCES;
+       }
+       
+       public MetersResource meters() {
+               return METERS;
+       }
+       
+}
diff --git a/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/QueriableCeilometerCommand.java b/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/QueriableCeilometerCommand.java
new file mode 100644 (file)
index 0000000..444c052
--- /dev/null
@@ -0,0 +1,58 @@
+package com.woorea.openstack.ceilometer;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.woorea.openstack.base.client.OpenStackRequest;
+
+public abstract class QueriableCeilometerCommand<T,R> extends OpenStackRequest<R> {
+       
+       protected List<String> fields = new ArrayList<String>();
+       
+       protected List<String> ops = new ArrayList<String>();
+       
+       protected List<Serializable> values = new ArrayList<Serializable>();
+       
+       private T filter(String field, String op, Serializable value) {
+               fields.add(field);
+               ops.add(op);
+               values.add(value);
+               return (T) this;
+       }
+       
+       public T lt(String field, Serializable value) {
+               return filter(field, "lt", value);
+       }
+       
+       public T le(String field, Serializable value) {
+               return filter(field, "le", value);
+       }
+       
+       public T eq(String field, Serializable value) {
+               return filter(field, "eq", value);
+       }
+       
+       public T ne(String field, Serializable value) {
+               return filter(field, "ne", value);
+       }
+       
+       public T ge(String field, Serializable value) {
+               return filter(field, "ge", value);
+       }
+       
+       public T gt(String field, Serializable value) {
+               return filter(field, "gt", value);
+       }
+
+       /*
+       public WebTarget query(WebTarget target) {
+               if(fields.size() > 0) {
+                       target = target.queryParam("q.field", fields.toArray());
+                       target = target.queryParam("q.op", ops.toArray());
+                       target = target.queryParam("q.value", values.toArray());
+               }
+               return target;
+       }
+       */
+}
diff --git a/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/v2/api/MetersResource.java b/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/v2/api/MetersResource.java
new file mode 100644 (file)
index 0000000..e44dbe6
--- /dev/null
@@ -0,0 +1,71 @@
+package com.woorea.openstack.ceilometer.v2.api;
+
+
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.ceilometer.QueriableCeilometerCommand;
+import com.woorea.openstack.ceilometer.v2.model.Sample;
+
+public class MetersResource {
+       
+       private final OpenStackClient CLIENT;
+       
+       public MetersResource(OpenStackClient client) {
+               CLIENT = client;
+       }
+       
+       public List list() {
+               return new List();
+       }
+       
+       public Show show() {
+               return new Show();
+       }
+       
+       public Statistics statistics() {
+               return new Statistics();
+       }
+       
+       public class List extends QueriableCeilometerCommand<List, java.util.List<Sample>> {
+               public List() {
+                       //return query(target.path("meters")).request(MediaType.APPLICATION_JSON).get(new GenericType<List<Meter>>() {});
+               }
+       }
+       
+       public class Show extends QueriableCeilometerCommand<Show, java.util.List<Sample>> {
+
+               private String name;
+                       
+               public Show name(String name) {
+                       this.name = name;
+                       return this;
+               }
+               
+               public Show() {
+//                     if(name == null) {
+//                             throw new UnsupportedOperationException("meter id is mandatory");
+//                     }
+//                     return query(target.path("meters").path(name)).request(MediaType.APPLICATION_JSON).get(new GenericType<List<Sample>>() {});
+               }
+
+       }
+
+       public class Statistics extends QueriableCeilometerCommand<Statistics, java.util.List<Statistics>> {
+
+               private String name;
+                       
+               public Statistics name(String name) {
+                       this.name = name;
+                       return this;
+               }
+               
+               public Statistics() {
+//                     if(name == null) {
+//                             throw new UnsupportedOperationException("meter id is mandatory");
+//                     }
+//                     return query(target.path("meters").path(name).path("statistics")).request(MediaType.APPLICATION_JSON).get(new GenericType<List<Statistics>>(){});
+               }
+
+       }
+
+}
diff --git a/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/v2/api/ResourcesResource.java b/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/v2/api/ResourcesResource.java
new file mode 100644 (file)
index 0000000..9001687
--- /dev/null
@@ -0,0 +1,45 @@
+package com.woorea.openstack.ceilometer.v2.api;
+
+import java.util.List;
+
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.ceilometer.QueriableCeilometerCommand;
+import com.woorea.openstack.ceilometer.v2.model.Resource;
+
+public class ResourcesResource {
+       
+       private final OpenStackClient CLIENT;
+       
+       public ResourcesResource(OpenStackClient client) {
+               CLIENT = client;
+       }
+
+       public class ResourceList extends QueriableCeilometerCommand<ResourceList, List<Resource>> {
+       
+               public ResourceList() {
+                       OpenStackRequest request = new OpenStackRequest();
+                       //return query(target.path("resources")).request(MediaType.APPLICATION_JSON).get(new GenericType<List<Resource>>() {});
+               }
+
+       }
+       
+       public class ResourceShow extends OpenStackRequest<Void> {
+
+               private String id;
+                       
+               public ResourceShow id(String id) {
+                       this.id = id;
+                       return this;
+               }
+               
+               public ResourceShow(OpenStackClient client) {
+//                     if(id == null) {
+//                             throw new UnsupportedOperationException("resource id is mandatory");
+//                     }
+//                     return target.path("resources").path(id).request(MediaType.APPLICATION_JSON).get(Resource.class);
+               }
+
+       }
+
+}
diff --git a/ceilometer-model/pom.xml b/ceilometer-model/pom.xml
new file mode 100644 (file)
index 0000000..9f0abe6
--- /dev/null
@@ -0,0 +1,12 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+       <modelVersion>4.0.0</modelVersion>
+       <parent>
+               <groupId>org.openecomp.mso.libs</groupId>
+               <artifactId>openstack-java-sdk</artifactId>
+               <version>1.0.0-SNAPSHOT</version>
+       </parent>
+       <groupId>org.openecomp.mso.libs.openstack-java-sdk</groupId>
+       <artifactId>ceilometer-model</artifactId>
+       <name>OpenStack Ceilometer Model</name>
+       <description>OpenStack Ceilometer Model</description>
+</project>
diff --git a/ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Meter.java b/ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Meter.java
new file mode 100644 (file)
index 0000000..df9182f
--- /dev/null
@@ -0,0 +1,54 @@
+package com.woorea.openstack.ceilometer.v2.model;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class Meter {
+
+       @JsonProperty("user_id")
+       private String user;
+       
+       
+       private String name;
+       
+       @JsonProperty("resource_id")
+       private String resource;
+       
+       @JsonProperty("project_id")
+       private String project;
+       
+       private String type;
+       
+       private String unit;
+
+       public String getUser() {
+               return user;
+       }
+
+       public String getName() {
+               return name;
+       }
+
+       public String getResource() {
+               return resource;
+       }
+
+       public String getProject() {
+               return project;
+       }
+
+       public String getType() {
+               return type;
+       }
+
+       public String getUnit() {
+               return unit;
+       }
+
+       @Override
+       public String toString() {
+               return "Meter [user=" + user + ", name=" + name + ", resource="
+                               + resource + ", project=" + project + ", type=" + type
+                               + ", unit=" + unit + "]";
+       }
+
+}
diff --git a/ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Resource.java b/ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Resource.java
new file mode 100644 (file)
index 0000000..24e14aa
--- /dev/null
@@ -0,0 +1,50 @@
+package com.woorea.openstack.ceilometer.v2.model;
+
+import java.util.Map;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class Resource {
+       //{"resource_id": "23b55841eedd41e99d5f3f32149ca086", "timestamp": "2013-03-03T15:19:00", "project_id": "23b55841eedd41e99d5f3f32149ca086", "user_id": null, "metadata": {}}
+       
+       @JsonProperty("resource_id")
+       private String resource;
+       
+       private String timestamp;
+       
+       @JsonProperty("project_id")
+       private String project;
+       
+       @JsonProperty("user_id")
+       private String user;
+       
+       private Map<String, Object> metadata;
+
+       public String getResource() {
+               return resource;
+       }
+
+       public String getTimestamp() {
+               return timestamp;
+       }
+
+       public String getProject() {
+               return project;
+       }
+
+       public String getUser() {
+               return user;
+       }
+
+       public Map<String, Object> getMetadata() {
+               return metadata;
+       }
+
+       @Override
+       public String toString() {
+               return "Resource [resource=" + resource + ", timestamp=" + timestamp
+                               + ", project=" + project + ", user=" + user + ", metadata="
+                               + metadata + "]";
+       }
+       
+}
diff --git a/ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Sample.java b/ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Sample.java
new file mode 100644 (file)
index 0000000..8827de4
--- /dev/null
@@ -0,0 +1,94 @@
+package com.woorea.openstack.ceilometer.v2.model;
+
+import java.util.Map;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class Sample {
+
+       @JsonProperty("counter_type")
+       private String counterType;
+
+       @JsonProperty("counter_name")
+       private String counterName;
+       
+       @JsonProperty("counter_unit")
+       private String counterUnit;
+       
+       @JsonProperty("counter_volume")
+       private String counterVolume;
+       
+       private String source;
+       
+       @JsonProperty("project_id")
+       private String project;
+       
+       @JsonProperty("user_id")
+       private String user;
+       
+       @JsonProperty("resource_id")
+       private String resource;
+       
+       private String timestamp;
+       
+       @JsonProperty("message_id")
+       private String message;
+       
+       @JsonProperty("resource_metadata")
+       private Map<String, Object> metadata;
+
+       public String getCounterType() {
+               return counterType;
+       }
+
+       public String getCounterName() {
+               return counterName;
+       }
+
+       public String getCounterUnit() {
+               return counterUnit;
+       }
+
+       public String getCounterVolume() {
+               return counterVolume;
+       }
+
+       public String getSource() {
+               return source;
+       }
+
+       public String getProject() {
+               return project;
+       }
+
+       public String getUser() {
+               return user;
+       }
+
+       public String getResource() {
+               return resource;
+       }
+
+       public String getTimestamp() {
+               return timestamp;
+       }
+
+       public String getMessage() {
+               return message;
+       }
+
+       public Map<String, Object> getMetadata() {
+               return metadata;
+       }
+
+       @Override
+       public String toString() {
+               return "Sample [counterType=" + counterType + ", counterName="
+                               + counterName + ", counterUnit=" + counterUnit
+                               + ", counterVolume=" + counterVolume + ", source=" + source
+                               + ", project=" + project + ", user=" + user + ", resource="
+                               + resource + ", timestamp=" + timestamp + ", message="
+                               + message + ", metadata=" + metadata + "]";
+       }
+       
+}
diff --git a/ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Statistics.java b/ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Statistics.java
new file mode 100644 (file)
index 0000000..5a34fe5
--- /dev/null
@@ -0,0 +1,88 @@
+package com.woorea.openstack.ceilometer.v2.model;
+
+import java.math.BigDecimal;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class Statistics {
+       
+       private BigDecimal avg;
+       
+       private BigDecimal count;
+       
+       private BigDecimal duration;
+       
+       @JsonProperty("duration_start")
+       private String durationStart;
+       
+       @JsonProperty("duration_end")
+       private String durationEnd;
+       
+       private BigDecimal max;
+       
+       private BigDecimal min;
+       
+       private BigDecimal period;
+       
+       @JsonProperty("period_start")
+       private String periodStart;
+       
+       @JsonProperty("period_end")
+       private String periodEnd;
+       
+       private BigDecimal sum;
+
+       public BigDecimal getAvg() {
+               return avg;
+       }
+
+       public BigDecimal getCount() {
+               return count;
+       }
+
+       public BigDecimal getDuration() {
+               return duration;
+       }
+
+       public String getDurationStart() {
+               return durationStart;
+       }
+
+       public String getDurationEnd() {
+               return durationEnd;
+       }
+
+       public BigDecimal getMax() {
+               return max;
+       }
+
+       public BigDecimal getMin() {
+               return min;
+       }
+
+       public BigDecimal getPeriod() {
+               return period;
+       }
+
+       public String getPeriodStart() {
+               return periodStart;
+       }
+
+       public String getPeriodEnd() {
+               return periodEnd;
+       }
+
+       public BigDecimal getSum() {
+               return sum;
+       }
+
+       @Override
+       public String toString() {
+               return "Statistics [avg=" + avg + ", count=" + count + ", duration="
+                               + duration + ", durationStart=" + durationStart
+                               + ", durationEnd=" + durationEnd + ", max=" + max + ", min="
+                               + min + ", period=" + period + ", periodStart=" + periodStart
+                               + ", periodEnd=" + periodEnd + ", sum=" + sum + "]";
+       }
+       
+}
diff --git a/glance-client/pom.xml b/glance-client/pom.xml
new file mode 100644 (file)
index 0000000..80c62cd
--- /dev/null
@@ -0,0 +1,25 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.openecomp.mso.libs</groupId>
+    <artifactId>openstack-java-sdk</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+  </parent>
+  <groupId>org.openecomp.mso.libs.openstack-java-sdk</groupId>
+  <artifactId>glance-client</artifactId>
+  <name>OpenStack Glance Client</name>
+  <description>OpenStack Glance Client</description>
+  <dependencies>
+               <dependency>
+                       <groupId>org.openecomp.mso.libs.openstack-java-sdk</groupId>
+                       <artifactId>openstack-client</artifactId>
+                       <version>1.0.0-SNAPSHOT</version>
+               </dependency>
+
+               <dependency>
+                       <groupId>org.openecomp.mso.libs.openstack-java-sdk</groupId>
+                       <artifactId>glance-model</artifactId>
+                       <version>1.0.0-SNAPSHOT</version>
+               </dependency>
+  </dependencies>
+</project>
\ No newline at end of file
diff --git a/glance-client/src/main/java/com/woorea/openstack/glance/Glance.java b/glance-client/src/main/java/com/woorea/openstack/glance/Glance.java
new file mode 100644 (file)
index 0000000..67714e7
--- /dev/null
@@ -0,0 +1,30 @@
+package com.woorea.openstack.glance;
+
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackClientConnector;
+
+public class Glance extends OpenStackClient {
+       
+       private final ImagesResource IMAGES;
+       
+       private final SharedImagesResource SHARED_IMAGES;
+
+       public Glance(String endpoint, OpenStackClientConnector connector) {
+               super(endpoint, connector);
+               IMAGES = new ImagesResource(this);
+               SHARED_IMAGES = new SharedImagesResource(this);
+       }
+       
+       public Glance(String endpoint) {
+               this(endpoint, null);
+       }
+       
+       public final ImagesResource images() {
+               return IMAGES;
+       }
+       
+       public final SharedImagesResource sharedImages() {
+               return SHARED_IMAGES;
+       }
+
+}
diff --git a/glance-client/src/main/java/com/woorea/openstack/glance/ImagesResource.java b/glance-client/src/main/java/com/woorea/openstack/glance/ImagesResource.java
new file mode 100644 (file)
index 0000000..ae46548
--- /dev/null
@@ -0,0 +1,280 @@
+package com.woorea.openstack.glance;
+
+import java.util.Calendar;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+import com.woorea.openstack.base.client.Entity;
+import com.woorea.openstack.base.client.HttpMethod;
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.base.client.OpenStackResponse;
+import com.woorea.openstack.glance.model.Image;
+import com.woorea.openstack.glance.model.ImageDownload;
+import com.woorea.openstack.glance.model.ImageUpload;
+import com.woorea.openstack.glance.model.ImageMember;
+import com.woorea.openstack.glance.model.ImageMembers;
+import com.woorea.openstack.glance.model.Images;
+
+public class ImagesResource {
+
+       private final OpenStackClient CLIENT;
+       
+       public ImagesResource(OpenStackClient client) {
+               CLIENT = client;
+       }
+       
+       public List list(boolean detail) {
+               return new List(detail);
+       }
+       
+       public Create create(Image image) {
+               return new Create(image);
+       }
+       
+       public Show show(String id) {
+               return new Show(id);
+       }
+       
+       public Update update(String id, Image image) {
+               return new Update(id, image);
+       }
+       
+       public Delete delete(String id) {
+               return new Delete(id);
+       }
+       
+       public Upload upload(ImageUpload image) {
+               return new Upload(image);
+       }
+       
+       public Upload upload(String id, ImageUpload image) {
+               return new Upload(id, image);
+       }
+
+       public Download download(String id) {
+               return new Download(id);
+       }
+       
+       public ListMembers listMembers(String id) {
+               return new ListMembers(id);
+       }
+       
+       public ReplaceMembers replaceMembers(String id, Collection<ImageMember> members) {
+               return new ReplaceMembers(id, members);
+       }
+       
+       public AddMember addMember(String id, String tenantId) {
+               return new AddMember(id, tenantId);
+       }
+       
+       public AddMember removeMember(String id, String tenantId) {
+               return new AddMember(id, tenantId);
+       }
+
+       public class List extends OpenStackRequest<Images> {
+               
+               public List(boolean detail) {
+                       super(CLIENT, HttpMethod.GET, detail ? "/images/detail" : "images", null, Images.class);
+               }
+
+       }
+       
+       public class Create extends OpenStackRequest<Image> {
+
+               public Create(Image image) {
+                       super(CLIENT, HttpMethod.POST, "/images", null, Image.class);
+                       for (Map.Entry<String, String> entry : compose(image).entrySet()) {
+                               header(entry.getKey(), entry.getValue());
+                       }
+               }
+               
+       }
+       
+       public class Update extends OpenStackRequest<Image> {
+               
+               public Update(String id, Image image) {
+                       super(CLIENT, HttpMethod.PUT, new StringBuilder("/images/").append(id).toString(), Entity.json(image), Image.class);
+               }
+
+       }
+       
+       public class Delete extends OpenStackRequest<Void> {
+               
+               public Delete(String id) {
+                       super(CLIENT, HttpMethod.DELETE, new StringBuilder("/images/").append(id).toString(), null, Void.class);
+               }
+               
+       }
+       
+       public class Show extends OpenStackRequest<Image> {
+               
+               public Show(String id) {
+                       super(CLIENT, HttpMethod.HEAD, new StringBuilder("/images/").append(id).toString(), null, Image.class);
+               }
+
+               @Override
+               public Image execute() {
+                       // custom parsing here
+                       return parse(CLIENT.request(this).headers());
+               }
+               
+       }
+       
+       public class Upload extends OpenStackRequest<Image> {
+               
+               public Upload(String id, ImageUpload imageUpload) {
+                       super(CLIENT, HttpMethod.PUT, new StringBuilder("/images/").append(id).toString(),
+                                       Entity.stream(imageUpload.getInputStream()), Image.class);
+               }
+
+               public Upload(ImageUpload imageUpload) {
+                       super(CLIENT, HttpMethod.POST, "/images", Entity.stream(imageUpload.getInputStream()), Image.class);
+
+                       for (Map.Entry<String, String> entry : compose(imageUpload.getImage()).entrySet()) {
+                               header(entry.getKey(), entry.getValue());
+                       }
+
+                       //file,s3,swift
+                       header("x-image-meta-store", imageUpload.getStore());
+               }
+
+       }
+       
+       public class Download extends OpenStackRequest<ImageDownload> {
+               
+               public Download(String id) {
+                       super(CLIENT, HttpMethod.GET, new StringBuilder("/images/").append(id).toString(), null, ImageDownload.class);
+                       header("Accept", "application/octet-stream");
+               }
+
+               @Override
+               public ImageDownload execute() {
+                       // custom parsing here
+                       OpenStackResponse response = CLIENT.request(this);
+                       ImageDownload imageDownload = new ImageDownload();
+                       imageDownload.setImage(parse(response.headers()));
+                       imageDownload.setInputStream(response.getInputStream());
+                       return imageDownload;
+               }
+
+       }
+       
+       public class ListMembers extends OpenStackRequest<ImageMembers> {
+               
+               public ListMembers(String id) {
+                       super(CLIENT, HttpMethod.GET, new StringBuilder("/images/").append(id).append("/members").toString(), null, ImageMembers.class);
+               }
+               
+       }
+       
+       public class ReplaceMembers extends OpenStackRequest<Void> {
+               
+               public ReplaceMembers(String id, Collection<ImageMember> members) {
+                       super(CLIENT, HttpMethod.PUT, new StringBuilder("/images/").append(id).append("/members").toString(), Entity.json(new Memberships(members)), Void.class);
+               }
+               
+       }
+
+       public class AddMember extends OpenStackRequest<ImageMember> {
+       
+               public AddMember(String id, String tenantId) {
+                       super(CLIENT, HttpMethod.PUT, new StringBuilder("/images/").append(id).append("/members").append(tenantId).toString(), null, ImageMember.class);
+               }
+
+       }
+
+       public class RemoveMember extends OpenStackRequest<Void> {
+       
+               public RemoveMember(String id, String tenantId) {
+                       super(CLIENT, HttpMethod.DELETE, new StringBuilder("/images/").append(id).append("/members/").append(tenantId).toString(), null, Void.class);
+               }
+
+       }
+
+       public static Map<String, String> compose(Image image) {
+               Map<String, String> headers = new HashMap<String, String>();
+
+               headers.put("X-Image-Meta-Name", image.getName());
+               headers.put("X-Image-Meta-Disk_format", image.getDiskFormat());
+               headers.put("X-Image-Meta-Container_format", image.getContainerFormat());
+               headers.put("X-Image-Meta-Id", image.getId());
+               headers.put("X-Image-Meta-Size", (image.getSize() != null) ? image.getSize().toString() : null);
+               headers.put("X-Image-Meta-Checksum", image.getChecksum());
+               headers.put("X-Image-Meta-Is_public", String.valueOf(image.isPublic()));
+               headers.put("X-Image-Meta-Owner", image.getOwner());
+
+               for(String key : image.getProperties().keySet()) {
+                       image.getProperties().put("x-image-meta-property-" + key, image.getProperties().get(key));
+               }
+
+               return headers;
+       }
+
+       public static Image parse(Map<String, String> headers) {
+               Image image = new Image();
+               image.setId(headers.get("X-Image-Meta-Id"));
+               image.setUri(headers.get("Location"));
+               image.setName(headers.get("X-Image-Meta-Name"));
+               image.setDiskFormat(headers.get("X-Image-Meta-Disk_format"));
+               image.setContainerFormat(headers.get("X-Image-Meta-Container_format"));
+               image.setSize(asLong(headers.get("X-Image-Meta-Size")));
+               image.setChecksum(headers.get("X-Image-Meta-Checksum"));
+               image.setCreatedAt(asCalendar(headers.get("X-Image-Meta-Created_at")));
+               image.setUpdatedAt(asCalendar(headers.get("X-Image-Meta-Updated_at")));
+               image.setDeletedAt(asCalendar(headers.get("X-Image-Meta-Deleted_at")));
+               image.setDeleted(asBoolean(headers.get("X-Image-Meta-Deleted")));
+               image.setStatus(headers.get("X-Image-Meta-Status"));
+               image.setProtected(asBoolean(headers.get("X-Image-Meta-Protected")));
+               image.setPublic(asBoolean(headers.get("X-Image-Meta-Is_public")));
+               image.setMinRam(asInteger(headers.get("X-Image-Meta-Min_ram")));
+               image.setMinDisk(asInteger(headers.get("X-Image-Meta-Min_disk")));
+               image.setOwner(headers.get("X-Image-Meta-Owner"));
+               for(String key : headers.keySet()) {
+                       if(key.startsWith("x-image-meta-property-")) {
+                               image.getProperties().put(key.substring(22), headers.get(key));
+                       }
+               }
+               return image;
+       }
+       
+       private static Calendar asCalendar(String calendarString) {
+               return Calendar.getInstance();
+       }
+       
+       private static Integer asInteger(String integerString) {
+               if(integerString != null) {
+                       return Integer.parseInt(integerString);
+               }
+               return 0;
+       }
+       
+       private static Boolean asBoolean(String booleanString) {
+               if(booleanString != null) {
+                       return Boolean.parseBoolean(booleanString);
+               }
+               return Boolean.FALSE;
+       }
+       
+       private static Long asLong(String longString) {
+               if(longString != null) {
+                       return Long.parseLong(longString);
+               }
+               return 0L;
+       }
+       
+       public static class Memberships {
+               
+               @JsonProperty("memberships")
+               private Collection<ImageMember> memberships;
+               
+               public Memberships(Collection<ImageMember> memberships) {
+                       this.memberships = memberships;
+               }
+               
+       }
+       
+}
diff --git a/glance-client/src/main/java/com/woorea/openstack/glance/SharedImagesResource.java b/glance-client/src/main/java/com/woorea/openstack/glance/SharedImagesResource.java
new file mode 100644 (file)
index 0000000..a461554
--- /dev/null
@@ -0,0 +1,30 @@
+package com.woorea.openstack.glance;
+
+
+import com.woorea.openstack.base.client.HttpMethod;
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.glance.model.Images;
+import com.woorea.openstack.glance.model.SharedImages;
+
+public class SharedImagesResource {
+
+       private final OpenStackClient CLIENT;
+       
+       public SharedImagesResource(OpenStackClient client) {
+               CLIENT = client;
+       }
+       
+       public List list(String tenantId, boolean detail) {
+               return new List(tenantId, detail);
+       }
+
+       public class List extends OpenStackRequest<SharedImages> {
+               
+               public List(String tenantId, boolean detail) {
+                       super(CLIENT, HttpMethod.GET, new StringBuffer(detail ? "/shared-images/detail" : "/shared-images/").append(tenantId).toString(), null, SharedImages.class);
+               }
+
+       }
+       
+}
diff --git a/glance-model/pom.xml b/glance-model/pom.xml
new file mode 100644 (file)
index 0000000..613ad97
--- /dev/null
@@ -0,0 +1,12 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+       <modelVersion>4.0.0</modelVersion>
+       <parent>
+               <groupId>org.openecomp.mso.libs</groupId>
+               <artifactId>openstack-java-sdk</artifactId>
+               <version>1.0.0-SNAPSHOT</version>
+       </parent>
+       <groupId>org.openecomp.mso.libs.openstack-java-sdk</groupId>
+       <artifactId>glance-model</artifactId>
+       <name>OpenStack Glance Model</name>
+       <description>OpenStack Glance Model</description>
+</project>
\ No newline at end of file
diff --git a/glance-model/src/main/java/com/woorea/openstack/glance/model/Image.java b/glance-model/src/main/java/com/woorea/openstack/glance/model/Image.java
new file mode 100644 (file)
index 0000000..4bd49e0
--- /dev/null
@@ -0,0 +1,343 @@
+package com.woorea.openstack.glance.model;
+
+import java.io.Serializable;
+import java.util.Calendar;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("image")
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class Image implements Serializable {
+
+       private String id;
+
+       private String uri;
+       
+       private String name;
+       
+       @JsonProperty("disk_format")
+       private String diskFormat;
+       
+       @JsonProperty("container_format")
+       private String containerFormat;
+       
+       private Long size;
+
+       @JsonProperty("virtual_size")
+       private Long virtualSize;
+       
+       private String checksum;
+       
+       @JsonProperty("created_at")
+       private Calendar createdAt;
+       
+       @JsonProperty("updated_at")
+       private Calendar updatedAt;
+       
+       @JsonProperty("deleted_at")
+       private Calendar deletedAt;
+       
+       private String status;
+       
+       @JsonProperty("is_public")
+       private boolean isPublic;
+       
+       @JsonProperty("min_ram")
+       private Integer minRam;
+       
+       @JsonProperty("min_disk")
+       private Integer minDisk;
+       
+       private String owner;
+       
+       @JsonProperty("deleted")
+       private boolean isDeleted;
+       
+       @JsonProperty("protected")
+       private boolean isProtected;
+       
+       private Map<String, Object> properties;
+
+       /**
+        * @return the id
+        */
+       public String getId() {
+               return id;
+       }
+
+       /**
+        * @param id the id to set
+        */
+       public void setId(String id) {
+               this.id = id;
+       }
+
+       /**
+        * @return the uri
+        */
+       public String getUri() {
+               return uri;
+       }
+
+       /**
+        * @param uri the uri to set
+        */
+       public void setUri(String uri) {
+               this.uri = uri;
+       }
+
+       /**
+        * @return the name
+        */
+       public String getName() {
+               return name;
+       }
+
+       /**
+        * @param name the name to set
+        */
+       public void setName(String name) {
+               this.name = name;
+       }
+
+       /**
+        * @return the diskFormat
+        */
+       public String getDiskFormat() {
+               return diskFormat;
+       }
+
+       /**
+        * @param diskFormat the diskFormat to set
+        */
+       public void setDiskFormat(String diskFormat) {
+               this.diskFormat = diskFormat;
+       }
+
+       /**
+        * @return the containerFormat
+        */
+       public String getContainerFormat() {
+               return containerFormat;
+       }
+
+       /**
+        * @param containerFormat the containerFormat to set
+        */
+       public void setContainerFormat(String containerFormat) {
+               this.containerFormat = containerFormat;
+       }
+
+       /**
+        * @return the size
+        */
+       public Long getSize() {
+               return size;
+       }
+
+       /**
+        * @param size the size to set
+        */
+       public void setSize(Long size) {
+               this.size = size;
+       }
+
+       /**
+        * @return the virtual size
+        */
+       public Long getVirtualSize() {
+               return virtualSize;
+       }
+
+       /**
+        * @param size the virtual size to set
+        */
+       public void setVirtualSize(Long virtualSize) {
+               this.virtualSize = virtualSize;
+       }
+
+       /**
+        * @return the checksum
+        */
+       public String getChecksum() {
+               return checksum;
+       }
+
+       /**
+        * @param checksum the checksum to set
+        */
+       public void setChecksum(String checksum) {
+               this.checksum = checksum;
+       }
+
+       /**
+        * @return the createdAt
+        */
+       public Calendar getCreatedAt() {
+               return createdAt;
+       }
+
+       /**
+        * @param createdAt the createdAt to set
+        */
+       public void setCreatedAt(Calendar createdAt) {
+               this.createdAt = createdAt;
+       }
+
+       /**
+        * @return the updatedAt
+        */
+       public Calendar getUpdatedAt() {
+               return updatedAt;
+       }
+
+       /**
+        * @param updatedAt the updatedAt to set
+        */
+       public void setUpdatedAt(Calendar updatedAt) {
+               this.updatedAt = updatedAt;
+       }
+
+       /**
+        * @return the deletedAt
+        */
+       public Calendar getDeletedAt() {
+               return deletedAt;
+       }
+
+       /**
+        * @param deletedAt the deletedAt to set
+        */
+       public void setDeletedAt(Calendar deletedAt) {
+               this.deletedAt = deletedAt;
+       }
+
+       /**
+        * @return the status
+        */
+       public String getStatus() {
+               return status;
+       }
+
+       /**
+        * @param status the status to set
+        */
+       public void setStatus(String status) {
+               this.status = status;
+       }
+
+       /**
+        * @return the isPublic
+        */
+       public boolean isPublic() {
+               return isPublic;
+       }
+
+       /**
+        * @param isPublic the isPublic to set
+        */
+       public void setPublic(boolean isPublic) {
+               this.isPublic = isPublic;
+       }
+
+       /**
+        * @return the minRam
+        */
+       public Integer getMinRam() {
+               return minRam;
+       }
+
+       /**
+        * @param minRam the minRam to set
+        */
+       public void setMinRam(Integer minRam) {
+               this.minRam = minRam;
+       }
+
+       /**
+        * @return the minDisk
+        */
+       public Integer getMinDisk() {
+               return minDisk;
+       }
+
+       /**
+        * @param minDisk the minDisk to set
+        */
+       public void setMinDisk(Integer minDisk) {
+               this.minDisk = minDisk;
+       }
+
+       /**
+        * @return the owner
+        */
+       public String getOwner() {
+               return owner;
+       }
+
+       /**
+        * @param owner the owner to set
+        */
+       public void setOwner(String owner) {
+               this.owner = owner;
+       }
+
+       /**
+        * @return the isDeleted
+        */
+       public boolean isDeleted() {
+               return isDeleted;
+       }
+
+       /**
+        * @param isDeleted the isDeleted to set
+        */
+       public void setDeleted(boolean isDeleted) {
+               this.isDeleted = isDeleted;
+       }
+
+       /**
+        * @return the isProtected
+        */
+       public boolean isProtected() {
+               return isProtected;
+       }
+
+       /**
+        * @param isProtected the isProtected to set
+        */
+       public void setProtected(boolean isProtected) {
+               this.isProtected = isProtected;
+       }
+
+       /**
+        * @return the properties
+        */
+       public Map<String, Object> getProperties() {
+               if(properties == null) {
+                       properties = new HashMap<String, Object>();
+               }
+               return properties;
+       }
+
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Image [id=" + id + ", uri=" + uri + ", name=" + name
+                               + ", diskFormat=" + diskFormat + ", containerFormat="
+                               + containerFormat + ", size=" + size + ", checksum=" + checksum
+                               + ", createdAt=" + createdAt + ", updatedAt=" + updatedAt
+                               + ", deletedAt=" + deletedAt + ", status=" + status
+                               + ", isPublic=" + isPublic + ", minRam=" + minRam
+                               + ", minDisk=" + minDisk + ", owner=" + owner + ", isDeleted="
+                               + isDeleted + ", isProtected=" + isProtected + ", properties="
+                               + properties + "]";
+       }
+       
+}
diff --git a/glance-model/src/main/java/com/woorea/openstack/glance/model/ImageDownload.java b/glance-model/src/main/java/com/woorea/openstack/glance/model/ImageDownload.java
new file mode 100644 (file)
index 0000000..d7c575c
--- /dev/null
@@ -0,0 +1,39 @@
+package com.woorea.openstack.glance.model;
+
+import java.io.InputStream;
+
+public class ImageDownload {
+       
+       private Image image;
+       
+       private InputStream inputStream;
+
+       /**
+        * @return the image
+        */
+       public Image getImage() {
+               return image;
+       }
+
+       /**
+        * @param image the image to set
+        */
+       public void setImage(Image image) {
+               this.image = image;
+       }
+
+       /**
+        * @return the inputStream
+        */
+       public InputStream getInputStream() {
+               return inputStream;
+       }
+
+       /**
+        * @param inputStream the inputStream to set
+        */
+       public void setInputStream(InputStream inputStream) {
+               this.inputStream = inputStream;
+       }
+
+}
diff --git a/glance-model/src/main/java/com/woorea/openstack/glance/model/ImageMember.java b/glance-model/src/main/java/com/woorea/openstack/glance/model/ImageMember.java
new file mode 100644 (file)
index 0000000..4b8c3e7
--- /dev/null
@@ -0,0 +1,52 @@
+package com.woorea.openstack.glance.model;
+
+import java.io.Serializable;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class ImageMember implements Serializable {
+
+       @JsonProperty("can_share")
+       private boolean canShare;
+       
+       @JsonProperty("member_id")
+       private String memberId;
+
+       public ImageMember() {
+               
+       }
+
+       public ImageMember(boolean canShare, String memberId) {
+               this.canShare = canShare;
+               this.memberId = memberId;
+       }
+
+       /**
+        * @return the canShare
+        */
+       public boolean isCanShare() {
+               return canShare;
+       }
+
+       /**
+        * @param canShare the canShare to set
+        */
+       public void setCanShare(boolean canShare) {
+               this.canShare = canShare;
+       }
+
+       /**
+        * @return the memberId
+        */
+       public String getMemberId() {
+               return memberId;
+       }
+
+       /**
+        * @param memberId the memberId to set
+        */
+       public void setMemberId(String memberId) {
+               this.memberId = memberId;
+       }
+
+}
diff --git a/glance-model/src/main/java/com/woorea/openstack/glance/model/ImageMembers.java b/glance-model/src/main/java/com/woorea/openstack/glance/model/ImageMembers.java
new file mode 100644 (file)
index 0000000..68aa176
--- /dev/null
@@ -0,0 +1,26 @@
+package com.woorea.openstack.glance.model;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class ImageMembers implements Iterable<ImageMember>, Serializable {
+
+       @JsonProperty("members")
+       private List<ImageMember> list;
+
+       /**
+        * @return the list
+        */
+       public List<ImageMember> getList() {
+               return list;
+       }
+
+       @Override
+       public Iterator<ImageMember> iterator() {
+               return list.iterator();
+       }
+       
+}
\ No newline at end of file
diff --git a/glance-model/src/main/java/com/woorea/openstack/glance/model/ImageUpload.java b/glance-model/src/main/java/com/woorea/openstack/glance/model/ImageUpload.java
new file mode 100644 (file)
index 0000000..326f5e0
--- /dev/null
@@ -0,0 +1,67 @@
+package com.woorea.openstack.glance.model;
+
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+public class ImageUpload {
+
+       private Image image;
+
+       private String store;
+
+       private Map<String, Object> properties;
+
+       private InputStream inputStream;
+
+       public ImageUpload(Image image) {
+               setImage(image);
+       }
+
+       public Image getImage() {
+               return image;
+       }
+
+       public void setImage(Image image) {
+               this.image = image;
+       }
+
+       /**
+        * @return the store
+        */
+       public String getStore() {
+               return store;
+       }
+
+       /**
+        * @param store the store to set
+        */
+       public void setStore(String store) {
+               this.store = store;
+       }
+
+       /**
+        * @return the properties
+        */
+       public Map<String, Object> getProperties() {
+               if(properties == null) {
+                       properties = new HashMap<String, Object>();
+               }
+               return properties;
+       }
+
+       /**
+        * @return the inputStream
+        */
+       public InputStream getInputStream() {
+               return inputStream;
+       }
+
+       /**
+        * @param inputStream the inputStream to set
+        */
+       public void setInputStream(InputStream inputStream) {
+               this.inputStream = inputStream;
+       }
+
+}
diff --git a/glance-model/src/main/java/com/woorea/openstack/glance/model/Images.java b/glance-model/src/main/java/com/woorea/openstack/glance/model/Images.java
new file mode 100644 (file)
index 0000000..af612ba
--- /dev/null
@@ -0,0 +1,26 @@
+package com.woorea.openstack.glance.model;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class Images implements Iterable<Image>, Serializable {
+
+       @JsonProperty("images")
+       private List<Image> list;
+
+       /**
+        * @return the list
+        */
+       public List<Image> getList() {
+               return list;
+       }
+
+       @Override
+       public Iterator<Image> iterator() {
+               return list.iterator();
+       }
+       
+}
diff --git a/glance-model/src/main/java/com/woorea/openstack/glance/model/SharedImage.java b/glance-model/src/main/java/com/woorea/openstack/glance/model/SharedImage.java
new file mode 100644 (file)
index 0000000..ae23a66
--- /dev/null
@@ -0,0 +1,5 @@
+package com.woorea.openstack.glance.model;
+
+public class SharedImage {
+       
+}
\ No newline at end of file
diff --git a/glance-model/src/main/java/com/woorea/openstack/glance/model/SharedImages.java b/glance-model/src/main/java/com/woorea/openstack/glance/model/SharedImages.java
new file mode 100644 (file)
index 0000000..111d094
--- /dev/null
@@ -0,0 +1,26 @@
+package com.woorea.openstack.glance.model;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class SharedImages implements Iterable<SharedImage>, Serializable {
+
+       @JsonProperty("shared_images")
+       private List<SharedImage> list;
+
+       /**
+        * @return the list
+        */
+       public List<SharedImage> getList() {
+               return list;
+       }
+
+       @Override
+       public Iterator<SharedImage> iterator() {
+               return list.iterator();
+       }
+       
+}
\ No newline at end of file
diff --git a/heat-client/pom.xml b/heat-client/pom.xml
new file mode 100644 (file)
index 0000000..b94cf80
--- /dev/null
@@ -0,0 +1,26 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.openecomp.mso.libs</groupId>
+    <artifactId>openstack-java-sdk</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+  </parent>
+  <groupId>org.openecomp.mso.libs.openstack-java-sdk</groupId>
+  <artifactId>heat-client</artifactId>
+  <name>OpenStack Heat Client</name>
+  <description>OpenStack Heat Client</description>
+  <dependencies>
+               <dependency>
+                       <groupId>org.openecomp.mso.libs.openstack-java-sdk</groupId>
+                       <artifactId>openstack-client</artifactId>
+                       <version>1.0.0-SNAPSHOT</version>
+               </dependency>
+
+               <dependency>
+                       <groupId>org.openecomp.mso.libs.openstack-java-sdk</groupId>
+                       <artifactId>heat-model</artifactId>
+                       <version>1.0.0-SNAPSHOT</version>
+               </dependency>
+  </dependencies>
+</project>
\ No newline at end of file
diff --git a/heat-client/src/main/java/com/woorea/openstack/heat/Heat.java b/heat-client/src/main/java/com/woorea/openstack/heat/Heat.java
new file mode 100644 (file)
index 0000000..96e9cd7
--- /dev/null
@@ -0,0 +1,31 @@
+package com.woorea.openstack.heat;
+
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackClientConnector;
+
+/**
+ * Reference: http://api.openstack.org/api-ref-orchestration.html
+ */
+public class Heat extends OpenStackClient {
+
+    private final StackResource stacks;
+    private final ResourcesResource resources;
+
+    public Heat(String endpoint, OpenStackClientConnector connector) {
+        super(endpoint, connector);
+        stacks = new StackResource(this);
+        resources = new ResourcesResource(this);
+    }
+
+    public Heat(String endpoint) {
+        this(endpoint, null);
+    }
+
+    public StackResource getStacks() {
+        return stacks;
+    }
+
+    public ResourcesResource getResources() {
+        return resources;
+    }
+}
diff --git a/heat-client/src/main/java/com/woorea/openstack/heat/ResourcesResource.java b/heat-client/src/main/java/com/woorea/openstack/heat/ResourcesResource.java
new file mode 100644 (file)
index 0000000..c3635bc
--- /dev/null
@@ -0,0 +1,31 @@
+package com.woorea.openstack.heat;
+
+import com.woorea.openstack.base.client.HttpMethod;
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.heat.model.Resources;
+
+
+/**
+ * v1/​{tenant_id}​/stacks/​{stack_name}​/resources
+ */
+public class ResourcesResource {
+    private final OpenStackClient client;
+
+    public ResourcesResource(OpenStackClient client) {
+        this.client = client;
+    }
+
+    public ListResources listResources(String name) {
+        return new ListResources(name);
+    }
+
+    /**
+     * v1/​{tenant_id}​/stacks/​{stack_name}​/resources
+     */
+    public class ListResources extends OpenStackRequest<Resources> {
+        public ListResources(String name) {
+            super(client, HttpMethod.GET, "/stacks/" + name + "/resources", null, Resources.class);
+        }
+    }
+}
diff --git a/heat-client/src/main/java/com/woorea/openstack/heat/StackResource.java b/heat-client/src/main/java/com/woorea/openstack/heat/StackResource.java
new file mode 100644 (file)
index 0000000..055a5c4
--- /dev/null
@@ -0,0 +1,76 @@
+package com.woorea.openstack.heat;
+
+/*
+ * Modifications copyright (c) 2017 AT&T Intellectual Property
+ */
+
+import com.woorea.openstack.base.client.Entity;
+import com.woorea.openstack.base.client.HttpMethod;
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.heat.model.CreateStackParam;
+import com.woorea.openstack.heat.model.UpdateStackParam;
+import com.woorea.openstack.heat.model.Stack;
+import com.woorea.openstack.heat.model.Stacks;
+
+public class StackResource {
+
+    private final OpenStackClient client;
+
+    public StackResource(OpenStackClient client) {
+        this.client = client;
+    }
+
+    public CreateStack create(CreateStackParam param) {
+        return new CreateStack(param);
+    }
+
+    public UpdateStack update(String name, UpdateStackParam param) {
+        return new UpdateStack(name, param);
+    }
+
+    public List list() {
+        return new List();
+    }
+
+    public GetStack byName(String name) {
+        return new GetStack(name);
+    }
+
+    public DeleteStack deleteByName(String name) {
+        return new DeleteStack(name);
+    }
+
+    public class CreateStack extends OpenStackRequest<Stack> {
+        public CreateStack(CreateStackParam params) {
+            super(client, HttpMethod.POST, "/stacks", Entity.json(params), Stack.class);
+        }
+    }
+
+    public class UpdateStack extends OpenStackRequest<Void> {
+        public UpdateStack(String name, UpdateStackParam params) {
+            super(client, HttpMethod.PUT, "/stacks/" + name, Entity.json(params), Void.class);
+        }
+    }
+
+    public class DeleteStack extends OpenStackRequest<Void> {
+        public DeleteStack(String name) {
+            super(client, HttpMethod.DELETE, "/stacks/" + name, null, Void.class);
+        }
+    }
+
+
+    public class GetStack extends OpenStackRequest<Stack> {
+        public GetStack(String name) {
+            super(client, HttpMethod.GET, "/stacks/" + name, null, Stack.class);
+        }
+    }
+
+    public class List extends OpenStackRequest<Stacks> {
+        public List() {
+            super(client, HttpMethod.GET, "/stacks", null, Stacks.class);
+        }
+    }
+
+
+}
diff --git a/heat-model/pom.xml b/heat-model/pom.xml
new file mode 100644 (file)
index 0000000..103ca4e
--- /dev/null
@@ -0,0 +1,12 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+       <modelVersion>4.0.0</modelVersion>
+       <parent>
+               <groupId>org.openecomp.mso.libs</groupId>
+               <artifactId>openstack-java-sdk</artifactId>
+               <version>1.0.0-SNAPSHOT</version>
+       </parent>
+       <groupId>org.openecomp.mso.libs.openstack-java-sdk</groupId>
+       <artifactId>heat-model</artifactId>
+       <name>OpenStack Heat Model</name>
+       <description>OpenStack Heat Model</description>
+</project>
\ No newline at end of file
diff --git a/heat-model/src/main/java/com/woorea/openstack/heat/model/CreateStackParam.java b/heat-model/src/main/java/com/woorea/openstack/heat/model/CreateStackParam.java
new file mode 100644 (file)
index 0000000..bcf3e8a
--- /dev/null
@@ -0,0 +1,127 @@
+package com.woorea.openstack.heat.model;
+
+/*
+ * Modifications copyright (c) 2017 AT&T Intellectual Property
+ */
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+import java.util.Map;
+
+public class CreateStackParam {
+    @JsonProperty("stack_name")
+    private String stackName;
+
+    @JsonProperty("template_url")
+    private String templateUrl;
+
+    @JsonProperty
+    private String template;
+
+    @JsonProperty("parameters")
+    private Map<String, Object> parameters;
+
+    @JsonProperty("timeout_mins")
+    private int timeoutMinutes;
+
+    @JsonProperty("environment")
+    private String environment;
+
+    @JsonProperty("disable_rollback")
+    private boolean disableRollback = true;
+    
+    @JsonProperty("files")
+    private Map<String, Object> files;
+
+    public String getStackName() {
+        return stackName;
+    }
+
+    public void setStackName(String stackName) {
+        this.stackName = stackName;
+    }
+
+    public String getTemplateUrl() {
+        return templateUrl;
+    }
+
+    /**
+     * The URL of the template to instantiate. This value is ignored if the template is supplied inline.
+     *
+     * @param templateUrl a template url.
+     */
+    public void setTemplateUrl(String templateUrl) {
+        this.templateUrl = templateUrl;
+    }
+
+    public Map<String, Object> getParameters() {
+        return parameters;
+    }
+
+    public String getTemplate() {
+        return template;
+    }
+
+    /**
+     * A JSON template to instantiate. This value takes precedence over the template URL if both are supplied.
+     *
+     * @param template a template json.
+     */
+    public void setTemplate(String template) {
+        this.template = template;
+    }
+
+    public void setParameters(Map<String, Object> parameters) {
+        this.parameters = parameters;
+    }
+
+    public int getTimeoutMinutes() {
+        return timeoutMinutes;
+    }
+
+    public void setTimeoutMinutes(int timeoutMinutes) {
+        this.timeoutMinutes = timeoutMinutes;
+    }
+
+    public String getEnvironment() {
+        return environment;
+    }
+
+    /**
+     * A JSON environment for the stack.
+     *
+     * @param environment a environment.
+     */
+    public void setEnvironment(String environment) {
+        this.environment = environment;
+    }
+
+    public boolean getDisableRollback() {
+        return disableRollback;
+    }
+
+    public void setDisableRollback(boolean disableRollback) {
+        this.disableRollback = disableRollback;
+    }
+    
+    public void setFiles(Map<String, Object> files) {
+       this.files = files;
+    }
+    public Map<String, Object> getFiles() {
+       return this.files;
+    }
+
+    @Override
+    public String toString() {
+        return "CreateStackParam{" +
+                "stackName='" + stackName + '\'' +
+                ", templateUrl='" + templateUrl + '\'' +
+                ", template='" + template + '\'' +
+                ", parameters=" + parameters +
+                ", timeoutMinutes=" + timeoutMinutes +
+                ", environment='" + environment + '\'' +
+                ", disableRollback='" + disableRollback + '\'' +
+                ", files=" + files +
+                '}';
+    }
+}
diff --git a/heat-model/src/main/java/com/woorea/openstack/heat/model/Explanation.java b/heat-model/src/main/java/com/woorea/openstack/heat/model/Explanation.java
new file mode 100644 (file)
index 0000000..816d2f8
--- /dev/null
@@ -0,0 +1,77 @@
+package com.woorea.openstack.heat.model;
+
+/*
+ * Modifications copyright (c) 2017 AT&T Intellectual Property
+ */
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+// There is no Root element for the Explanation return
+//@JsonRootName("error")
+public class Explanation {
+    @JsonProperty("explanation")
+    private String explanation;
+
+    @JsonProperty("code")
+    private int code;
+
+    @JsonProperty("title")
+    private String title;
+    
+    @JsonRootName("error")
+    public static class Error {
+        @JsonProperty("message")
+        private String message;
+
+        @JsonProperty("traceback")
+        private String traceback;
+
+        @JsonProperty("type")
+        private String type;
+
+        public String getMessage() {
+               return message;
+        }
+        
+        public String getTraceback() {
+               return traceback;
+        }
+        
+        public String getType() {
+               return type;
+        }
+    }
+    private Error error;
+    
+    public String getExplanation() {
+       return explanation;
+    }
+    
+    public int getCode() {
+       return code;
+    }
+    
+    public String getTitle() {
+       return title;
+    }
+    
+    public Error getError() {
+       return error;
+    }
+
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Explanation [ " +
+                               "code='" + code +
+                               "', title='" + title +
+                               "', explanation='" + explanation +
+                               "', Error [type='" + error.type +
+                               "', message='" + error.message + "' ] ]";
+       }
+
+}
diff --git a/heat-model/src/main/java/com/woorea/openstack/heat/model/Link.java b/heat-model/src/main/java/com/woorea/openstack/heat/model/Link.java
new file mode 100644 (file)
index 0000000..ec1970f
--- /dev/null
@@ -0,0 +1,35 @@
+package com.woorea.openstack.heat.model;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class Link {
+    @JsonProperty("href")
+    private String href;
+
+    @JsonProperty("rel")
+    private String rel;
+
+    public String getHref() {
+        return href;
+    }
+
+    public void setHref(String href) {
+        this.href = href;
+    }
+
+    public String getRel() {
+        return rel;
+    }
+
+    public void setRel(String rel) {
+        this.rel = rel;
+    }
+
+    @Override
+    public String toString() {
+        return "Link{" +
+                "href='" + href + '\'' +
+                ", rel='" + rel + '\'' +
+                '}';
+    }
+}
diff --git a/heat-model/src/main/java/com/woorea/openstack/heat/model/Resource.java b/heat-model/src/main/java/com/woorea/openstack/heat/model/Resource.java
new file mode 100644 (file)
index 0000000..159bbcd
--- /dev/null
@@ -0,0 +1,122 @@
+package com.woorea.openstack.heat.model;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+import java.util.Date;
+import java.util.List;
+
+public class Resource {
+    @JsonProperty("resource_name")
+    private String name;
+
+    @JsonProperty("links")
+    private List<Link> links;
+
+    @JsonProperty("resource_status")
+    private String status;
+
+    @JsonProperty("physical_resource_id")
+    private String physicalResourceId;
+
+    @JsonProperty("logical_resource_id")
+    private String logicalResourceId;
+
+    @JsonProperty("required_by")
+    private List<String> requiredBy;
+
+    @JsonProperty("updated_time")
+    private Date updatedTime;
+
+    @JsonProperty("resource_type")
+    private String type;
+
+    @JsonProperty("resource_status_reason")
+    private String statusReason;
+
+    public String getStatusReason() {
+        return statusReason;
+    }
+
+    public void setStatusReason(String statusReason) {
+        this.statusReason = statusReason;
+    }
+
+    public String getLogicalResourceId() {
+        return logicalResourceId;
+    }
+
+    public void setLogicalResourceId(String logicalResourceId) {
+        this.logicalResourceId = logicalResourceId;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getPhysicalResourceId() {
+        return physicalResourceId;
+    }
+
+    public void setPhysicalResourceId(String physicalResourceId) {
+        this.physicalResourceId = physicalResourceId;
+    }
+
+    public List<String> getRequiredBy() {
+        return requiredBy;
+    }
+
+    public void setRequiredBy(List<String> requiredBy) {
+        this.requiredBy = requiredBy;
+    }
+
+    public Date getUpdatedTime() {
+        return updatedTime;
+    }
+
+    public void setUpdatedTime(Date updatedTime) {
+        this.updatedTime = updatedTime;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public List<Link> getLinks() {
+        return links;
+    }
+
+    public void setLinks(List<Link> links) {
+        this.links = links;
+    }
+
+    @Override
+    public String toString() {
+        return "Resource{" +
+                "name='" + name + '\'' +
+                ", links=" + links +
+                ", status='" + status + '\'' +
+                ", physicalResourceId='" + physicalResourceId + '\'' +
+                ", logicalResourceId='" + logicalResourceId + '\'' +
+                ", requiredBy=" + requiredBy +
+                ", updatedTime=" + updatedTime +
+                ", type='" + type + '\'' +
+                ", statusReason='" + statusReason + '\'' +
+                '}';
+    }
+}
diff --git a/heat-model/src/main/java/com/woorea/openstack/heat/model/Resources.java b/heat-model/src/main/java/com/woorea/openstack/heat/model/Resources.java
new file mode 100644 (file)
index 0000000..068c5e0
--- /dev/null
@@ -0,0 +1,28 @@
+package com.woorea.openstack.heat.model;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+
+public class Resources implements Iterable<Resource>, Serializable {
+    @JsonProperty("resources")
+    private List<Resource> list;
+
+    public List<Resource> getList() {
+        return list;
+    }
+
+    @Override
+    public Iterator<Resource> iterator() {
+        return list.iterator();
+    }
+
+    @Override
+    public String toString() {
+        return "Resources{" +
+                "list=" + list +
+                '}';
+    }
+}
\ No newline at end of file
diff --git a/heat-model/src/main/java/com/woorea/openstack/heat/model/Stack.java b/heat-model/src/main/java/com/woorea/openstack/heat/model/Stack.java
new file mode 100644 (file)
index 0000000..5f58195
--- /dev/null
@@ -0,0 +1,243 @@
+package com.woorea.openstack.heat.model;
+
+/*
+ * Modifications copyright (c) 2017 AT&T Intellectual Property
+ */
+
+import org.codehaus.jackson.annotate.JsonIgnore;
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+import java.io.IOException;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+@JsonRootName("stack")
+public class Stack {
+    @JsonProperty("description")
+    private String description;
+
+    @JsonProperty("links")
+    private List<Link> links;
+
+    @JsonProperty("stack_status_reason")
+    private String stackStatusReason;
+
+    @JsonProperty("stack_name")
+    private String stackName;
+
+    @JsonProperty("updated_time")
+    private Date updatedTime;
+
+    @JsonProperty("creation_time")
+    private Date creationTime;
+
+    @JsonProperty("stack_status")
+    private String stackStatus;
+
+    @JsonProperty("id")
+    private String id;
+    
+    @JsonProperty("files")
+    private Map<String, Object> files = null;
+    
+    // ObjectMapper instance to parse Json stack outputs
+    @JsonIgnore
+       private static ObjectMapper mapper = new ObjectMapper();
+
+    public Date getUpdatedTime() {
+        return updatedTime;
+    }
+
+    public void setUpdatedTime(Date updatedTime) {
+        this.updatedTime = updatedTime;
+    }
+
+    public String getStackStatus() {
+        return stackStatus;
+    }
+
+    public void setStackStatus(String stackStatus) {
+        this.stackStatus = stackStatus;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public Date getCreationTime() {
+        return creationTime;
+    }
+
+    public void setCreationTime(Date creationTime) {
+        this.creationTime = creationTime;
+    }
+
+    public String getStackName() {
+        return stackName;
+    }
+
+    public void setStackName(String stackName) {
+        this.stackName = stackName;
+    }
+
+    public String getStackStatusReason() {
+        return stackStatusReason;
+    }
+
+    public void setStackStatusReason(String stackStatusReason) {
+        this.stackStatusReason = stackStatusReason;
+    }
+
+    public List<Link> getLinks() {
+        return links;
+    }
+
+    public void setLinks(List<Link> links) {
+        this.links = links;
+    }
+
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+    
+    public Map<String, Object> getFiles() {
+       return this.files;
+    }
+    public void setFiles(Map<String, Object> files) {
+       this.files = files;
+    }
+
+
+    @Override
+    public String toString() {
+        return "Stack{" +
+                "description='" + description + '\'' +
+                ", links=" + links +
+                ", stackStatusReason='" + stackStatusReason + '\'' +
+                ", stackName='" + stackName + '\'' +
+                ", updatedTime=" + updatedTime +
+                ", creationTime=" + creationTime +
+                ", stackStatus='" + stackStatus + '\'' +
+                ", id='" + id + '\'' +
+                ", outputs='" + outputs + '\'' +
+                ", parameters='" + parameters + '\'' +
+                ", files='" + files + '\'' +
+                '}';
+    }
+    
+       @JsonIgnoreProperties(ignoreUnknown=true)
+       public static final class Output {
+           @JsonProperty("output_value")
+               private Object outputValue;
+               
+               private String description;
+               
+           @JsonProperty("output_key")
+               private String outputKey;
+               
+               public Object getOutputValue() {
+                       return outputValue;
+               }
+
+               public String getDescription() {
+                       return description;
+               }
+
+               public String getOutputKey() {
+                       return outputKey;
+               }
+
+               /* (non-Javadoc)
+                * @see java.lang.Object#toString()
+                */
+               @Override
+               public String toString() {
+                       return "Output [key=" + outputKey + ", value="
+                                       + outputValue + "]";
+               }
+       }
+       
+       private List<Output> outputs;
+
+       public List<Output> getOutputs() {
+               return outputs;
+       }
+       
+       private Object _findOutputValue (String key) {
+               for (Output o : outputs) {
+                       if (o.getOutputKey().equals(key)) {
+                               return o.getOutputValue();
+                       }
+               }
+               return null;
+       }
+       
+       /*
+        * Return a stack output as a String.
+        * Generally speaking, most outputs will be Strings.
+        */
+       public String getOutputValue (String key)
+       {
+               Object value = _findOutputValue(key);
+               if (value != null)
+                       return value.toString();
+               else
+                       return null;
+       }
+       
+       /*
+        * Return a stack output as a Json-mapped Object of the provided type.
+        * This is useful for json-object stack outputs.
+        */
+       public <T> T getOutputValue (String key, Class<T> type)
+       {
+               try {
+                       String s = mapper.writeValueAsString(_findOutputValue(key));
+                       return (mapper.readValue(s, type));
+               }
+               catch (IOException e) {
+                       return null;
+               }
+       }
+       
+       @JsonProperty("parameters")
+       private Map<String,Object> parameters = new HashMap<String,Object>();
+       
+       public void setParameters (Map<String,Object> params)
+       {
+               // Need to "fix" comma-delimited-list parameters for pre-Juno Heat
+               // (see https://bugs.launchpad.net/heat/+bug/1367393)
+               parameters = params;
+               
+               for (Entry<String,Object> param : parameters.entrySet())
+               {
+                       // CDL params are returned as a string with format:
+                       // "[u'<value1>',u'<value2>',...]"
+                       String value = param.getValue().toString();
+                       if (value.startsWith("[") && value.endsWith("]"))
+                       {
+                               param.setValue(value.substring(1,value.length()-1).replaceAll("u'([^\']+)'","$1"));
+                       }
+               }
+       }
+       
+       public Map<String,Object> getParameters() {
+               return parameters;
+       }
+}
diff --git a/heat-model/src/main/java/com/woorea/openstack/heat/model/Stacks.java b/heat-model/src/main/java/com/woorea/openstack/heat/model/Stacks.java
new file mode 100644 (file)
index 0000000..6f174aa
--- /dev/null
@@ -0,0 +1,17 @@
+package com.woorea.openstack.heat.model;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+
+public class Stacks implements Iterable<Stack>, Serializable {
+    @JsonProperty("stacks")
+    private List<Stack> list;
+
+    @Override
+    public Iterator<Stack> iterator() {
+        return list.iterator();
+    }
+}
diff --git a/heat-model/src/main/java/com/woorea/openstack/heat/model/UpdateStackParam.java b/heat-model/src/main/java/com/woorea/openstack/heat/model/UpdateStackParam.java
new file mode 100644 (file)
index 0000000..5aa0b76
--- /dev/null
@@ -0,0 +1,134 @@
+/*
+ * ============LICENSE_START==========================================
+ * ===================================================================
+ * Copyright Â© 2017 AT&T Intellectual Property. All rights reserved.
+ * ===================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ *
+ */
+
+package com.woorea.openstack.heat.model;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+import java.util.Map;
+
+public class UpdateStackParam {
+    @JsonProperty("template_url")
+    private String templateUrl;
+
+    @JsonProperty
+    private String template;
+
+    @JsonProperty("parameters")
+    private Map<String, Object> parameters;
+
+    @JsonProperty("timeout_mins")
+    private int timeoutMinutes;
+
+    @JsonProperty("environment")
+    private String environment;
+
+    @JsonProperty("disable_rollback")
+    private boolean disableRollback = true;
+    
+    @JsonProperty("files")
+    private Map<String, Object> files;
+
+    public String getTemplateUrl() {
+        return templateUrl;
+    }
+
+    /**
+     * The URL of the template to instantiate. This value is ignored if the template is supplied inline.
+     *
+     * @param templateUrl a template url.
+     */
+    public void setTemplateUrl(String templateUrl) {
+        this.templateUrl = templateUrl;
+    }
+
+    public Map<String, Object> getParameters() {
+        return parameters;
+    }
+
+    public String getTemplate() {
+        return template;
+    }
+
+    /**
+     * A JSON template to instantiate. This value takes precedence over the template URL if both are supplied.
+     *
+     * @param template a template json.
+     */
+    public void setTemplate(String template) {
+        this.template = template;
+    }
+
+    public void setParameters(Map<String, Object> parameters) {
+        this.parameters = parameters;
+    }
+
+    public int getTimeoutMinutes() {
+        return timeoutMinutes;
+    }
+
+    public void setTimeoutMinutes(int timeoutMinutes) {
+        this.timeoutMinutes = timeoutMinutes;
+    }
+
+    public String getEnvironment() {
+        return environment;
+    }    
+
+    public void setFiles(Map<String, Object> files) {
+       this.files = files;
+    }
+    public Map<String, Object> getFiles() {
+       return this.files;
+    }
+
+    /**
+     * A JSON environment for the stack.
+     *
+     * @param environment a environment.
+     */
+    public void setEnvironment(String environment) {
+        this.environment = environment;
+    }
+
+    public boolean getDisableRollback() {
+        return disableRollback;
+    }
+
+    public void setDisableRollback(boolean disableRollback) {
+        this.disableRollback = disableRollback;
+    }
+
+    @Override
+    public String toString() {
+        return "UpdateStackParam{" +
+                " templateUrl='" + templateUrl + '\'' +
+                ", template='" + template + '\'' +
+                ", parameters=" + parameters +
+                ", timeoutMinutes=" + timeoutMinutes +
+                ", environment='" + environment + '\'' +
+                ", disableRollback='" + disableRollback + '\'' +
+                ", files=" + files +
+                '}';
+    }
+}
diff --git a/keystone-client/pom.xml b/keystone-client/pom.xml
new file mode 100644 (file)
index 0000000..cca8bda
--- /dev/null
@@ -0,0 +1,25 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.openecomp.mso.libs</groupId>
+    <artifactId>openstack-java-sdk</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+  </parent>
+  <groupId>org.openecomp.mso.libs.openstack-java-sdk</groupId>
+  <artifactId>keystone-client</artifactId>
+  <name>OpenStack Keystone Client</name>
+  <description>OpenStack Keystone Client</description>
+  <dependencies>
+               <dependency>
+                       <groupId>org.openecomp.mso.libs.openstack-java-sdk</groupId>
+                       <artifactId>openstack-client</artifactId>
+                       <version>1.0.0-SNAPSHOT</version>
+               </dependency>
+               <dependency>
+                       <groupId>org.openecomp.mso.libs.openstack-java-sdk</groupId>
+                       <artifactId>keystone-model</artifactId>
+                       <version>1.0.0-SNAPSHOT</version>
+               </dependency>
+  </dependencies>
+</project>
\ No newline at end of file
diff --git a/keystone-client/src/main/java/com/woorea/openstack/keystone/Keystone.java b/keystone-client/src/main/java/com/woorea/openstack/keystone/Keystone.java
new file mode 100644 (file)
index 0000000..38d42f0
--- /dev/null
@@ -0,0 +1,65 @@
+package com.woorea.openstack.keystone;
+
+import com.woorea.openstack.keystone.api.EndpointsResource;
+import com.woorea.openstack.keystone.api.RolesResource;
+import com.woorea.openstack.keystone.api.ServicesResource;
+import com.woorea.openstack.keystone.api.TenantsResource;
+import com.woorea.openstack.keystone.api.TokensResource;
+import com.woorea.openstack.keystone.api.UsersResource;
+
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackClientConnector;
+
+public class Keystone extends OpenStackClient {
+       
+       private final TokensResource TOKENS;
+       
+       private final TenantsResource TENANTS;
+       
+       private final UsersResource USERS;
+       
+       private final RolesResource ROLES;
+       
+       private final ServicesResource SERVICES;
+       
+       private final EndpointsResource ENDPOINTS;
+       
+       public Keystone(String endpoint, OpenStackClientConnector connector) {
+               super(endpoint, connector);
+               TOKENS = new TokensResource(this);
+               TENANTS = new TenantsResource(this);
+               USERS = new UsersResource(this);
+               ROLES = new RolesResource(this);
+               SERVICES = new ServicesResource(this);
+               ENDPOINTS = new EndpointsResource(this);
+       }
+       
+       public Keystone(String endpoint) {
+               this(endpoint, null);
+       }
+       
+       public TokensResource tokens() {
+               return TOKENS;
+       }
+       
+       public TenantsResource tenants() {
+               return TENANTS;
+       }
+       
+       public UsersResource users() {
+               return USERS;
+       }
+       
+       public RolesResource roles() {
+               return ROLES;
+       }
+       
+       public ServicesResource services() {
+               return SERVICES;
+       }
+       
+       public EndpointsResource endpoints() {
+               return ENDPOINTS;
+       }
+
+}
diff --git a/keystone-client/src/main/java/com/woorea/openstack/keystone/api/EndpointsResource.java b/keystone-client/src/main/java/com/woorea/openstack/keystone/api/EndpointsResource.java
new file mode 100644 (file)
index 0000000..acc128b
--- /dev/null
@@ -0,0 +1,71 @@
+package com.woorea.openstack.keystone.api;
+
+
+import com.woorea.openstack.base.client.Entity;
+import com.woorea.openstack.base.client.HttpMethod;
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.keystone.model.Endpoint;
+import com.woorea.openstack.keystone.model.Endpoints;
+
+public class EndpointsResource {
+       
+       private OpenStackClient client;
+       
+       public EndpointsResource(OpenStackClient client) {
+               this.client = client;
+       }
+       
+       public List list() {
+               return new List();
+       }
+       
+       public Create create(Endpoint endpoint) {
+               return new Create(endpoint);
+       }
+       
+       public Show show(String id) {
+               return new Show(id);
+       }
+
+       
+       public Delete delete(String id) {
+               return new Delete(id);
+       }
+
+       public class List extends OpenStackRequest<Endpoints> {
+               
+               public List() {
+                       super(client, HttpMethod.GET, "/endpoints", null, Endpoints.class);
+               }
+
+       }
+       
+       public class Create extends OpenStackRequest<Endpoint> {
+
+               private Endpoint endpoint;
+               
+               public Create(Endpoint endpoint) {
+                       super(client, HttpMethod.POST, "/endpoints", Entity.json(endpoint), Endpoint.class);
+                       this.endpoint = endpoint;
+               }
+               
+       }
+       
+       public class Show extends OpenStackRequest<Endpoint> {
+               
+               public Show(String id) {
+                       super(client, HttpMethod.GET, new StringBuilder("/endpoints/").append(id).toString(), null, Endpoint.class);
+               }
+
+       }
+       
+       public class Delete extends OpenStackRequest<Void> {
+               
+               public Delete(String id) {
+                       super(client, HttpMethod.DELETE, new StringBuilder("/endpoints/").append(id).toString(), null, Void.class);
+               }
+               
+       }
+       
+}
diff --git a/keystone-client/src/main/java/com/woorea/openstack/keystone/api/RolesResource.java b/keystone-client/src/main/java/com/woorea/openstack/keystone/api/RolesResource.java
new file mode 100644 (file)
index 0000000..d39dc77
--- /dev/null
@@ -0,0 +1,58 @@
+package com.woorea.openstack.keystone.api;
+
+
+import com.woorea.openstack.base.client.Entity;
+import com.woorea.openstack.base.client.HttpMethod;
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.keystone.model.Role;
+import com.woorea.openstack.keystone.model.Roles;
+
+public class RolesResource {
+       
+       private OpenStackClient client;
+       
+       public RolesResource(OpenStackClient client) {
+               this.client = client;
+       }
+       
+       public List list() {
+               return new List();
+       }
+       
+       public Create create(Role role) {
+               return new Create(role);
+       }
+       
+       public Delete delete(String id) {
+               return new Delete(id);
+       }
+
+       public class List extends OpenStackRequest<Roles> {
+               
+               public List() {
+                       super(client, HttpMethod.GET, "/OS-KSADM/roles", null, Roles.class);
+               }
+
+       }
+       
+       public class Create extends OpenStackRequest<Role> {
+
+               private Role role;
+               
+               public Create(Role role) {
+                       super(client, HttpMethod.POST, "/OS-KSADM/roles", Entity.json(role), Role.class);
+                       this.role = role;
+               }
+               
+       }
+       
+       public class Delete extends OpenStackRequest<Void> {
+               
+               public Delete(String id) {
+                       super(client, HttpMethod.DELETE, new StringBuilder("/OS-KSADM/roles/").append(id).toString(), null, Void.class);
+               }
+               
+       }
+       
+}
diff --git a/keystone-client/src/main/java/com/woorea/openstack/keystone/api/ServicesResource.java b/keystone-client/src/main/java/com/woorea/openstack/keystone/api/ServicesResource.java
new file mode 100644 (file)
index 0000000..5b18939
--- /dev/null
@@ -0,0 +1,70 @@
+package com.woorea.openstack.keystone.api;
+
+
+import com.woorea.openstack.base.client.Entity;
+import com.woorea.openstack.base.client.HttpMethod;
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.keystone.model.Service;
+import com.woorea.openstack.keystone.model.Services;
+
+public class ServicesResource {
+       
+       private OpenStackClient client;
+       
+       public ServicesResource(OpenStackClient client) {
+               this.client = client;
+       }
+       
+       public List list() {
+               return new List();
+       }
+       
+       public Create create(Service service) {
+               return new Create(service);
+       }
+       
+       public Show show(String id) {
+               return new Show(id);
+       }
+       
+       public Delete delete(String id) {
+               return new Delete(id);
+       }
+
+       public class List extends OpenStackRequest<Services> {
+               
+               public List() {
+                       super(client, HttpMethod.GET, "/OS-KSADM/services", null, Services.class);
+               }
+
+       }
+       
+       public class Create extends OpenStackRequest<Service> {
+
+               private Service service;
+               
+               public Create(Service service) {
+                       super(client, HttpMethod.POST, "/OS-KSADM/services", Entity.json(service), Service.class);
+                       this.service = service;
+               }
+               
+       }
+       
+       public class Show extends OpenStackRequest<Service> {
+               
+               public Show(String id) {
+                       super(client, HttpMethod.GET, new StringBuilder("/OS-KSADM/services/").append(id).toString(), null, Service.class);
+               }
+
+       }
+       
+       public class Delete extends OpenStackRequest<Void> {
+               
+               public Delete(String id) {
+                       super(client, HttpMethod.DELETE, new StringBuilder("/OS-KSADM/services/").append(id).toString(), null, Void.class);
+               }
+               
+       }
+       
+}
diff --git a/keystone-client/src/main/java/com/woorea/openstack/keystone/api/TenantsResource.java b/keystone-client/src/main/java/com/woorea/openstack/keystone/api/TenantsResource.java
new file mode 100644 (file)
index 0000000..a073241
--- /dev/null
@@ -0,0 +1,212 @@
+package com.woorea.openstack.keystone.api;
+
+/*
+ * Modifications copyright (c) 2017 AT&T Intellectual Property
+ */
+
+import com.woorea.openstack.base.client.Entity;
+import com.woorea.openstack.base.client.HttpMethod;
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.keystone.model.Roles;
+import com.woorea.openstack.keystone.model.Tenant;
+import com.woorea.openstack.keystone.model.Tenants;
+import com.woorea.openstack.keystone.model.Users;
+import com.woorea.openstack.keystone.model.Metadata;
+
+public class TenantsResource {
+       
+       private OpenStackClient client;
+       
+       public TenantsResource(OpenStackClient client) {
+               this.client = client;
+       }
+       
+       public List list() {
+               return new List();
+       }
+       
+       public Create create(Tenant tenant) {
+               return new Create(tenant);
+       }
+       
+       public Show show(String id) {
+               return new Show(id);
+       }
+       
+       public Update update(String id, Tenant tenant) {
+               return new Update(id, tenant);
+       }
+       
+       public Delete delete(String id) {
+               return new Delete(id);
+       }
+       
+       public ListUsers listUsers(String tenantId) {
+               return new ListUsers(tenantId);
+       }
+       
+       public AddUser addUser(String tenantId, String userId, String roleId) {
+               return new AddUser(tenantId, userId, roleId);
+       }
+       
+       public RemoveUser removeUser(String tenantId, String userId, String roleId) {
+               return new RemoveUser(tenantId, userId, roleId);
+       }
+       
+       public ListUserRoles listUserRoles(String tenantId, String userId) {
+               return new ListUserRoles(tenantId, userId);
+       }
+
+       public ShowMetadata showMetadata(String id) {
+               return new ShowMetadata(id);
+       }
+       
+       public CreateOrUpdateMetadata createOrUpdateMetadata(String id,Metadata metadata) {
+               return new CreateOrUpdateMetadata(id,metadata);
+       }
+       
+       public ReplaceMetadata replaceMetadata(String id,Metadata metadata) {
+               return new ReplaceMetadata(id,metadata);
+       }
+       
+       public ShowMetadataItem showMetadataItem(String id,String key) {
+               return new ShowMetadataItem(id,key);
+       }
+       
+       public CreateOrUpdateMetadataItem createOrUpdateMetadataItem(String id,String key,Metadata metadata) {
+               return new CreateOrUpdateMetadataItem(id,key,metadata);
+       }
+       
+       public DeleteMetadataItem deleteMetadataItem(String id, String key) {
+               return new DeleteMetadataItem(id,key);
+       }
+
+       public class List extends OpenStackRequest<Tenants> {
+               
+               public List() {
+                       super(client, HttpMethod.GET, "/tenants", null, Tenants.class);
+               }
+
+       }
+       
+       public class Create extends OpenStackRequest<Tenant> {
+
+               private Tenant tenant;
+               
+               public Create(Tenant tenant) {
+                       super(client, HttpMethod.POST, "/tenants", Entity.json(tenant), Tenant.class);
+                       this.tenant = tenant;
+               }
+               
+       }
+       
+       public class Show extends OpenStackRequest<Tenant> {
+               
+               public Show(String id) {
+                       super(client, HttpMethod.GET, new StringBuilder("/tenants/").append(id).toString(), null, Tenant.class);
+               }
+
+       }
+       
+       public class Update extends OpenStackRequest<Tenant> {
+               
+               private Tenant tenant;
+               
+               public Update(String id, Tenant tenant) {
+                       super(client, HttpMethod.PUT, new StringBuilder("/tenants/").append(id).toString(), Entity.json(tenant), Tenant.class);
+                       this.tenant = tenant;
+               }
+
+       }
+       
+       public class Delete extends OpenStackRequest<Void> {
+               
+               public Delete(String id) {
+                       super(client, HttpMethod.DELETE, new StringBuilder("/tenants/").append(id).toString(), null, Void.class);
+               }
+               
+       }
+       
+       public class ListUsers extends OpenStackRequest<Users> {
+               
+               public ListUsers(String tenantId) {
+                       super(client, HttpMethod.GET, new StringBuilder("/tenants/").append(tenantId).append("/users").toString(), null, Users.class);
+               }
+
+       }
+       
+       public class AddUser extends OpenStackRequest<Void> {
+               
+               public AddUser(String tenantId, String userId, String roleId) {
+                       super(client, HttpMethod.PUT, new StringBuilder("/tenants/").append(tenantId).append("/users/").append(userId).append("/roles/OS-KSADM/").append(roleId).toString(), null, Void.class);
+               }
+
+       }
+       
+       public class RemoveUser extends OpenStackRequest<Void> {
+               
+               public RemoveUser(String tenantId, String userId, String roleId) {
+                       super(client, HttpMethod.DELETE, new StringBuilder("/tenants/").append(tenantId).append("/users/").append(userId).append("/roles/OS-KSADM/").append(roleId).toString(), null, Void.class);
+               }
+
+       }
+       
+       public class ListUserRoles extends OpenStackRequest<Roles> {
+               
+               public ListUserRoles(String tenantId, String userId) {
+                       super(client, HttpMethod.GET, new StringBuilder("/tenants/").append(tenantId).append("/users/").append(userId).append("/roles").toString(), null, Roles.class);
+               }
+
+       }
+       
+       /**
+        * The following APIs support Tenant-level metadata.  This is a feature supported
+        * by the DCP/LCP (i.e. AIC cloud), but not native Openstack.  The full API as
+        * documented by AIC is implemented below.
+        */
+       public class ShowMetadata extends OpenStackRequest<Metadata> {
+
+               public ShowMetadata(String tenantId) {
+                       super(client, HttpMethod.GET, new StringBuilder("/tenants/").append(tenantId).append("/metadata"), null, Metadata.class);
+               }
+
+       }
+       
+       public class CreateOrUpdateMetadata extends OpenStackRequest<Metadata> {
+
+               public CreateOrUpdateMetadata(String tenantId,Metadata metadata) {
+                       super(client, HttpMethod.POST, new StringBuilder("/tenants/").append(tenantId).append("/metadata"), Entity.json(metadata), Metadata.class);
+               }
+
+       }
+       public class ReplaceMetadata extends OpenStackRequest<Metadata> {
+
+               public ReplaceMetadata(String tenantId,Metadata metadata) {
+                       super(client, HttpMethod.PUT, new StringBuilder("/tenants/").append(tenantId).append("/metadata"), Entity.json(metadata), Metadata.class);
+               }
+
+       }
+       
+       public class ShowMetadataItem extends OpenStackRequest<Metadata> {
+
+               public ShowMetadataItem(String tenantId, String key) {
+                       super(client, HttpMethod.GET, new StringBuilder("/tenants/").append(tenantId).append("/metadata").append(key), null, Metadata.class);
+               }
+
+       }
+       public class CreateOrUpdateMetadataItem extends OpenStackRequest<Metadata> {
+
+               public CreateOrUpdateMetadataItem(String tenantId,String key,Metadata metadata) {
+                       super(client, HttpMethod.POST, new StringBuilder("/tenants/").append(tenantId).append("/metadata").append(key), Entity.json(metadata), Metadata.class);
+               }
+
+       }
+       public class DeleteMetadataItem extends OpenStackRequest<Void> {
+
+               public DeleteMetadataItem(String tenantId,String key) {
+                       super(client, HttpMethod.DELETE, new StringBuilder("/tenants/").append(tenantId).append("/metadata/").append(key), null, Void.class);
+               }
+
+       }
+       }
diff --git a/keystone-client/src/main/java/com/woorea/openstack/keystone/api/TokensResource.java b/keystone-client/src/main/java/com/woorea/openstack/keystone/api/TokensResource.java
new file mode 100644 (file)
index 0000000..4f30313
--- /dev/null
@@ -0,0 +1,83 @@
+package com.woorea.openstack.keystone.api;
+
+/*
+ * Modifications copyright (c) 2017 AT&T Intellectual Property
+ */
+
+import com.woorea.openstack.base.client.Entity;
+import com.woorea.openstack.base.client.HttpMethod;
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.keystone.model.Access;
+import com.woorea.openstack.keystone.model.Authentication;
+import com.woorea.openstack.keystone.model.authentication.AccessKey;
+import com.woorea.openstack.keystone.model.authentication.RackspaceAuthentication;
+import com.woorea.openstack.keystone.model.authentication.TokenAuthentication;
+import com.woorea.openstack.keystone.model.authentication.UsernamePassword;
+
+public class TokensResource {
+       
+       private final OpenStackClient CLIENT;
+       
+       public TokensResource(OpenStackClient client) {
+               CLIENT = client;
+       }
+       
+       public Authenticate.Builder authenticate() {
+               return new Authenticate().new Builder();
+       }
+       
+       public Authenticate authenticate(Authentication authentication) {
+               return new Authenticate(authentication);
+       }
+
+       public class Authenticate extends OpenStackRequest<Access> {
+               
+               private Authentication authentication;
+               
+               public Authenticate() {
+                       
+               }
+               
+               public Authenticate(Authentication authentication) {
+                       super(CLIENT, HttpMethod.POST, "/tokens", Entity.json(authentication), Access.class);
+                       this.authentication = authentication;
+               }
+               
+               public Authenticate withTenantId(String tenantId) {
+                       authentication.setTenantId(tenantId);
+                       return this;
+               }
+               
+               public Authenticate withTenantName(String tenantName) {
+                       authentication.setTenantName(tenantName);
+                       return this;
+               }
+               
+               public class Builder {
+                       
+                       public Authenticate withUsernamePassword(String username, String password) {
+                               Authentication authentication = new UsernamePassword(username, password);
+                               return new Authenticate(authentication);
+                       }
+                       
+                       public Authenticate withToken(String token) {
+                               Authentication authentication = new TokenAuthentication(token);
+                               return new Authenticate(authentication);
+                       }
+                       
+                       public Authenticate withRackspace(String username, String apiKey, String region) {
+                               Authentication authentication = new RackspaceAuthentication(username, apiKey);
+                               return new Authenticate(authentication);
+                       }
+                       
+                       public Authenticate withAccessKey(String accessKey, String secretKey) {
+                               Authentication authentication = new AccessKey(accessKey, secretKey);
+                               return new Authenticate(authentication);
+                       }
+                       
+               }
+
+       }
+       
+}
diff --git a/keystone-client/src/main/java/com/woorea/openstack/keystone/api/UsersResource.java b/keystone-client/src/main/java/com/woorea/openstack/keystone/api/UsersResource.java
new file mode 100644 (file)
index 0000000..dbb897c
--- /dev/null
@@ -0,0 +1,85 @@
+package com.woorea.openstack.keystone.api;
+
+
+import com.woorea.openstack.base.client.Entity;
+import com.woorea.openstack.base.client.HttpMethod;
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.keystone.model.User;
+import com.woorea.openstack.keystone.model.Users;
+
+public class UsersResource {
+       
+       private OpenStackClient client;
+       
+       public UsersResource(OpenStackClient client) {
+               this.client = client;
+       }
+       
+       public List list() {
+               return new List();
+       }
+       
+       public Create create(User user) {
+               return new Create(user);
+       }
+       
+       public Show show(String id) {
+               return new Show(id);
+       }
+       
+       public Update update(String id, User user) {
+               return new Update(id, user);
+       }
+       
+       public Delete delete(String id) {
+               return new Delete(id);
+       }
+
+       public class List extends OpenStackRequest<Users> {
+               
+               public List() {
+                       super(client, HttpMethod.GET, "/users", null, Users.class);
+               }
+
+       }
+       
+       public class Create extends OpenStackRequest<User> {
+
+               private User user;
+               
+               public Create(User user) {
+                       super(client, HttpMethod.POST, "/users", Entity.json(user), User.class);
+                       this.user = user;
+               }
+               
+       }
+       
+       public class Show extends OpenStackRequest<User> {
+               
+               public Show(String id) {
+                       super(client, HttpMethod.GET, new StringBuilder("/users/").append(id).toString(), null, User.class);
+               }
+
+       }
+       
+       public class Update extends OpenStackRequest<User> {
+               
+               private User user;
+               
+               public Update(String id, User user) {
+                       super(client, HttpMethod.PUT, new StringBuilder("/users/").append(id).toString(), Entity.json(user), User.class);
+                       this.user = user;
+               }
+
+       }
+       
+       public class Delete extends OpenStackRequest<Void> {
+               
+               public Delete(String id) {
+                       super(client, HttpMethod.DELETE, new StringBuilder("/users/").append(id).toString(), null, Void.class);
+               }
+               
+       }
+       
+}
diff --git a/keystone-client/src/main/java/com/woorea/openstack/keystone/utils/KeystoneTokenProvider.java b/keystone-client/src/main/java/com/woorea/openstack/keystone/utils/KeystoneTokenProvider.java
new file mode 100644 (file)
index 0000000..fb5127a
--- /dev/null
@@ -0,0 +1,56 @@
+package com.woorea.openstack.keystone.utils;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+import com.woorea.openstack.base.client.OpenStackTokenProvider;
+import com.woorea.openstack.keystone.Keystone;
+import com.woorea.openstack.keystone.model.Access;
+import com.woorea.openstack.keystone.model.authentication.UsernamePassword;
+
+public class KeystoneTokenProvider {
+
+       protected Keystone keystone;
+
+       protected String username;
+
+       protected String password;
+
+       ConcurrentHashMap<String, Access> hashTenantAccess;
+
+       public KeystoneTokenProvider(String endpoint, String username, String password) {
+               this.keystone = new Keystone(endpoint);
+               this.username = username;
+               this.password = password;
+               this.hashTenantAccess = new ConcurrentHashMap<String, Access>();
+       }
+
+       public Access getAccessByTenant(String tenantName) {
+               Access access = hashTenantAccess.get(tenantName);
+               if (access == null) {
+                       access = keystone.tokens().authenticate(new UsernamePassword(username, password))
+                               .withTenantName(tenantName)
+                               .execute();
+                       hashTenantAccess.put(tenantName, access);
+               }
+               return access;
+       }
+
+       public void expireAccessByTenant(String tenantName) {
+               hashTenantAccess.remove(tenantName);
+       }
+
+       public OpenStackTokenProvider getProviderByTenant(final String tenantName) {
+               final KeystoneTokenProvider keystoneTokenProvider = this;
+               return new OpenStackTokenProvider() {
+                       @Override
+                       public String getToken() {
+                               return keystoneTokenProvider.getAccessByTenant(tenantName)
+                                               .getToken().getId();
+                       }
+                       @Override
+                       public void expireToken() {
+                               keystoneTokenProvider.expireAccessByTenant(tenantName);
+                       }
+               };
+       }
+}
diff --git a/keystone-client/src/main/java/com/woorea/openstack/keystone/utils/KeystoneUtils.java b/keystone-client/src/main/java/com/woorea/openstack/keystone/utils/KeystoneUtils.java
new file mode 100644 (file)
index 0000000..8269597
--- /dev/null
@@ -0,0 +1,28 @@
+package com.woorea.openstack.keystone.utils;
+
+import java.util.List;
+
+import com.woorea.openstack.keystone.model.Access.Service;
+
+public class KeystoneUtils {
+
+       public static String findEndpointURL(List<Service> serviceCatalog, String type, String region, String facing) {
+               for(Service service : serviceCatalog) {
+                       if(type.equals(service.getType())) {
+                               for(Service.Endpoint endpoint : service.getEndpoints()) {
+                                       if(region == null || region.equals(endpoint.getRegion())) {
+                                               if(endpoint.getPublicURL() != null && facing.equals("public")) {
+                                                       return endpoint.getPublicURL();
+                                               } else if(endpoint.getInternalURL() != null && facing.equals("internal")) {
+                                                       return endpoint.getInternalURL();
+                                               } else if(endpoint.getAdminURL() != null && facing.equals("admin")) {
+                                                       return endpoint.getAdminURL();
+                                               }
+                                       }
+                               }
+                       }
+               }
+               throw new RuntimeException("endpoint url not found");
+       }
+
+}
diff --git a/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/Keystone.java b/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/Keystone.java
new file mode 100644 (file)
index 0000000..6ff889c
--- /dev/null
@@ -0,0 +1,73 @@
+package com.woorea.openstack.keystone.v3;
+
+import com.woorea.openstack.keystone.v3.api.DomainsResource;
+import com.woorea.openstack.keystone.v3.api.EndpointsResource;
+import com.woorea.openstack.keystone.v3.api.RolesResource;
+import com.woorea.openstack.keystone.v3.api.ServicesResource;
+import com.woorea.openstack.keystone.v3.api.ProjectsResource;
+import com.woorea.openstack.keystone.v3.api.TokensResource;
+import com.woorea.openstack.keystone.v3.api.UsersResource;
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackClientConnector;
+
+public class Keystone extends OpenStackClient {
+       
+       private final TokensResource TOKENS;
+       
+       private final DomainsResource DOMAINS;
+       
+       private final ProjectsResource PROJECTS;
+       
+       private final UsersResource USERS;
+       
+       private final RolesResource ROLES;
+       
+       private final ServicesResource SERVICES;
+       
+       private final EndpointsResource ENDPOINTS;
+       
+       public Keystone(String endpoint, OpenStackClientConnector connector) {
+               super(endpoint, connector);
+               TOKENS = new TokensResource(this);
+               DOMAINS = new DomainsResource(this);
+               PROJECTS = new ProjectsResource(this);
+               USERS = new UsersResource(this);
+               ROLES = new RolesResource(this);
+               SERVICES = new ServicesResource(this);
+               ENDPOINTS = new EndpointsResource(this);
+       }
+       
+       public Keystone(String endpoint) {
+               this(endpoint, null);
+       }
+       
+       public TokensResource tokens() {
+               return TOKENS;
+       }
+       
+       public DomainsResource domains() {
+               return DOMAINS;
+       }
+       
+       public ProjectsResource projects() {
+               return PROJECTS;
+       }
+       
+       public UsersResource users() {
+               return USERS;
+       }
+       
+       public RolesResource roles() {
+               return ROLES;
+       }
+       
+       public ServicesResource services() {
+               return SERVICES;
+       }
+       
+       public EndpointsResource endpoints() {
+               return ENDPOINTS;
+       }
+
+}
+
diff --git a/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/CredentialsResources.java b/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/CredentialsResources.java
new file mode 100644 (file)
index 0000000..7be2620
--- /dev/null
@@ -0,0 +1,13 @@
+package com.woorea.openstack.keystone.v3.api;
+
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.keystone.v3.model.Credential;
+import com.woorea.openstack.keystone.v3.model.Credentials;
+
+public class CredentialsResources extends GenericResource<Credential, Credentials> {
+
+       public CredentialsResources(OpenStackClient client) {
+               super(client, "/credentials", Credential.class, Credentials.class);
+       }
+
+}
diff --git a/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/DomainGroupRolesResource.java b/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/DomainGroupRolesResource.java
new file mode 100644 (file)
index 0000000..a041ba2
--- /dev/null
@@ -0,0 +1,13 @@
+package com.woorea.openstack.keystone.v3.api;
+
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.keystone.v3.model.Role;
+import com.woorea.openstack.keystone.v3.model.Roles;
+
+public class DomainGroupRolesResource extends GenericResource<Role, Roles> {
+
+       public DomainGroupRolesResource(OpenStackClient client, String path) {
+               super(client, path, Role.class, Roles.class);
+       }
+
+}
diff --git a/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/DomainUserRolesResource.java b/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/DomainUserRolesResource.java
new file mode 100644 (file)
index 0000000..9a6e8e5
--- /dev/null
@@ -0,0 +1,24 @@
+package com.woorea.openstack.keystone.v3.api;
+
+import com.woorea.openstack.base.client.Entity;
+import com.woorea.openstack.base.client.HttpMethod;
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.keystone.model.Role;
+import com.woorea.openstack.keystone.model.Roles;
+
+public class DomainUserRolesResource extends GenericResource<Role, Roles> {
+
+       public DomainUserRolesResource(OpenStackClient client, String path) {
+               super(client, path, Role.class, Roles.class);
+       }
+
+       public OpenStackRequest<Void> add(String roleId) {
+               return new OpenStackRequest<Void>(CLIENT, HttpMethod.PUT, new StringBuilder(path).append("/").append(roleId).toString(), Entity.json(""), Void.class);
+       }
+       
+       public OpenStackRequest<Void> remove(String roleId) {
+               return new OpenStackRequest<Void>(CLIENT, HttpMethod.DELETE, new StringBuilder(path).append("/").append(roleId).toString(), null, Void.class);
+       }
+
+}
diff --git a/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/DomainsResource.java b/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/DomainsResource.java
new file mode 100644 (file)
index 0000000..28015ee
--- /dev/null
@@ -0,0 +1,21 @@
+package com.woorea.openstack.keystone.v3.api;
+
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.keystone.v3.model.Domain;
+import com.woorea.openstack.keystone.v3.model.Domains;
+
+public class DomainsResource extends GenericResource<Domain, Domains> {
+
+       public DomainsResource(OpenStackClient client) {
+               super(client, "/domains", Domain.class, Domains.class);
+       }
+       
+       public DomainUserRolesResource userRoles(String domainId, String userId) {
+               return new DomainUserRolesResource(CLIENT, new StringBuilder(path).append("/").append(domainId).append("/users/").append(userId).append("/roles").toString());
+       }
+       
+       public DomainUserRolesResource groupRoles(String domainId, String groupId) {
+               return new DomainUserRolesResource(CLIENT, new StringBuilder(path).append("/").append(domainId).append("/groups/").append(groupId).append("/roles").toString());
+       }
+
+}
diff --git a/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/EndpointsResource.java b/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/EndpointsResource.java
new file mode 100644 (file)
index 0000000..d1db88a
--- /dev/null
@@ -0,0 +1,13 @@
+package com.woorea.openstack.keystone.v3.api;
+
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.keystone.v3.model.Endpoint;
+import com.woorea.openstack.keystone.v3.model.Endpoints;
+
+public class EndpointsResource extends GenericResource<Endpoint, Endpoints> {
+
+       public EndpointsResource(OpenStackClient client) {
+               super(client, "/endpoints", Endpoint.class, Endpoints.class);
+       }
+
+}
diff --git a/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/GenericResource.java b/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/GenericResource.java
new file mode 100644 (file)
index 0000000..117e941
--- /dev/null
@@ -0,0 +1,44 @@
+package com.woorea.openstack.keystone.v3.api;
+
+import com.woorea.openstack.base.client.Entity;
+import com.woorea.openstack.base.client.HttpMethod;
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+
+public class GenericResource<One, Many> {
+
+       protected final OpenStackClient CLIENT;
+       
+       protected CharSequence path;
+       
+       protected Class<One> oneClass;
+       protected Class<Many> manyClass;
+       
+       public GenericResource(OpenStackClient client, CharSequence path, Class<One> oneClass, Class<Many> manyClass) {
+               CLIENT = client;
+               this.path = path;
+               this.oneClass = oneClass;
+               this.manyClass = manyClass;
+       }
+       
+       public OpenStackRequest<Many> list() {
+               return new OpenStackRequest<Many>(CLIENT, HttpMethod.GET, path, null, manyClass);
+       }
+       
+       public OpenStackRequest<One> create(One one) {
+               return new OpenStackRequest<One>(CLIENT, HttpMethod.POST, path, Entity.json(one), oneClass);
+       }
+       
+       public OpenStackRequest<One> show(String id) {
+               return new OpenStackRequest<One>(CLIENT, HttpMethod.GET, new StringBuilder(path).append("/").append(id).toString(), null, oneClass);
+       }
+       
+       public OpenStackRequest<One> update(String id, One one) {
+               return new OpenStackRequest<One>(CLIENT, HttpMethod.PATCH, new StringBuilder(path).append("/").append(id).toString(), Entity.json(one), oneClass);
+       }
+       
+       public OpenStackRequest<One> delete(String id) {
+               return new OpenStackRequest<One>(CLIENT, HttpMethod.DELETE, new StringBuilder(path).append("/").append(id).toString(), null, oneClass);
+       }
+       
+}
diff --git a/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/GroupUsersResource.java b/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/GroupUsersResource.java
new file mode 100644 (file)
index 0000000..60cce41
--- /dev/null
@@ -0,0 +1,14 @@
+package com.woorea.openstack.keystone.v3.api;
+
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.keystone.v3.model.User;
+import com.woorea.openstack.keystone.v3.model.Users;
+
+
+public class GroupUsersResource extends GenericResource<User, Users> {
+
+       public GroupUsersResource(OpenStackClient client, String path) {
+               super(client, path, User.class, Users.class);
+       }
+
+}
diff --git a/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/GroupsResource.java b/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/GroupsResource.java
new file mode 100644 (file)
index 0000000..be380cc
--- /dev/null
@@ -0,0 +1,17 @@
+package com.woorea.openstack.keystone.v3.api;
+
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.keystone.v3.model.Group;
+import com.woorea.openstack.keystone.v3.model.Groups;
+
+public class GroupsResource extends GenericResource<Group, Groups> {
+
+       public GroupsResource(OpenStackClient client) {
+               super(client, "/groups", Group.class, Groups.class);
+       }
+       
+       public DomainUserRolesResource userRoles(String domainId, String userId) {
+               return new DomainUserRolesResource(CLIENT, new StringBuilder(path).append("/").append(domainId).append("/users/").append(userId).append("/roles").toString());
+       }
+
+}
diff --git a/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/PoliciesResource.java b/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/PoliciesResource.java
new file mode 100644 (file)
index 0000000..ba16a46
--- /dev/null
@@ -0,0 +1,15 @@
+package com.woorea.openstack.keystone.v3.api;
+
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.keystone.model.Role;
+import com.woorea.openstack.keystone.model.Roles;
+import com.woorea.openstack.keystone.v3.model.Policies;
+import com.woorea.openstack.keystone.v3.model.Policy;
+
+public class PoliciesResource extends GenericResource<Policy, Policies> {
+
+       public PoliciesResource(OpenStackClient client) {
+               super(client, "/policies", Policy.class, Policies.class);
+       }
+
+}
diff --git a/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/ProjectGroupRolesResource.java b/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/ProjectGroupRolesResource.java
new file mode 100644 (file)
index 0000000..caed8ac
--- /dev/null
@@ -0,0 +1,34 @@
+package com.woorea.openstack.keystone.v3.api;
+
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.keystone.model.Role;
+import com.woorea.openstack.keystone.model.Roles;
+
+public class ProjectGroupRolesResource extends GenericResource<Role, Roles> {
+
+       public ProjectGroupRolesResource(OpenStackClient client, String path) {
+               super(client, path, Role.class, Roles.class);
+       }
+
+       @Override
+       public OpenStackRequest<Role> create(Role one) {
+               throw new UnsupportedOperationException();
+       }
+
+       @Override
+       public OpenStackRequest<Role> show(String id) {
+               throw new UnsupportedOperationException();
+       }
+
+       @Override
+       public OpenStackRequest<Role> update(String id, Role one) {
+               throw new UnsupportedOperationException();
+       }
+
+       @Override
+       public OpenStackRequest<Role> delete(String id) {
+               throw new UnsupportedOperationException();
+       }
+
+}
diff --git a/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/ProjectRolesResource.java b/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/ProjectRolesResource.java
new file mode 100644 (file)
index 0000000..7e7e2fa
--- /dev/null
@@ -0,0 +1,27 @@
+package com.woorea.openstack.keystone.v3.api;
+
+import com.woorea.openstack.base.client.Entity;
+import com.woorea.openstack.base.client.HttpMethod;
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+
+public class ProjectRolesResource {
+       
+       private final OpenStackClient CLIENT;
+       
+       private final String PATH;
+
+       public ProjectRolesResource(OpenStackClient client, String path) {
+               this.CLIENT = client;
+               this.PATH = path;
+       }
+       
+       public OpenStackRequest<Void> add(String roleId) {
+               return new OpenStackRequest<Void>(CLIENT, HttpMethod.PUT, new StringBuilder(PATH).append("/").append(roleId).toString(), Entity.json(""), Void.class);
+       }
+       
+       public OpenStackRequest<Void> remove(String roleId) {
+               return new OpenStackRequest<Void>(CLIENT, HttpMethod.DELETE, new StringBuilder(PATH).append("/").append(roleId).toString(), null, Void.class);
+       }
+
+}
diff --git a/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/ProjectUserRolesResource.java b/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/ProjectUserRolesResource.java
new file mode 100644 (file)
index 0000000..9f3dc50
--- /dev/null
@@ -0,0 +1,24 @@
+package com.woorea.openstack.keystone.v3.api;
+
+import com.woorea.openstack.base.client.Entity;
+import com.woorea.openstack.base.client.HttpMethod;
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.keystone.model.Role;
+import com.woorea.openstack.keystone.model.Roles;
+
+public class ProjectUserRolesResource extends GenericResource<Role, Roles> {
+
+       public ProjectUserRolesResource(OpenStackClient client, String path) {
+               super(client, path, Role.class, Roles.class);
+       }
+       
+       public OpenStackRequest<Void> add(String roleId) {
+               return new OpenStackRequest<Void>(CLIENT, HttpMethod.PUT, new StringBuilder(path).append("/").append(roleId).toString(), Entity.json(""), Void.class);
+       }
+       
+       public OpenStackRequest<Void> remove(String roleId) {
+               return new OpenStackRequest<Void>(CLIENT, HttpMethod.DELETE, new StringBuilder(path).append("/").append(roleId).toString(), null, Void.class);
+       }
+
+}
diff --git a/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/ProjectsResource.java b/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/ProjectsResource.java
new file mode 100644 (file)
index 0000000..2e9fd9a
--- /dev/null
@@ -0,0 +1,27 @@
+package com.woorea.openstack.keystone.v3.api;
+
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.keystone.model.Users;
+import com.woorea.openstack.keystone.v3.model.Project;
+import com.woorea.openstack.keystone.v3.model.Projects;
+
+public class ProjectsResource extends GenericResource<Project, Projects> {
+
+       public ProjectsResource(OpenStackClient client) {
+               super(client, "/projects", Project.class, Projects.class);
+       }
+       
+       public OpenStackRequest<Users> users(String projectId) {
+               return CLIENT.get(new StringBuilder(path).append("/").append(projectId).append("/users/").toString(), Users.class);
+       }
+       
+       public ProjectUserRolesResource userRoles(String projectId, String userId) {
+               return new ProjectUserRolesResource(CLIENT, new StringBuilder(path).append("/").append(projectId).append("/users/").append(userId).append("/roles").toString());
+       }
+       
+       public ProjectUserRolesResource groupRoles(String projectId, String groupId) {
+               return new ProjectUserRolesResource(CLIENT, new StringBuilder(path).append("/").append(projectId).append("/groups/").append(groupId).append("/roles").toString());
+       }
+
+}
diff --git a/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/RolesResource.java b/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/RolesResource.java
new file mode 100644 (file)
index 0000000..2c28a1b
--- /dev/null
@@ -0,0 +1,19 @@
+package com.woorea.openstack.keystone.v3.api;
+
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.keystone.v3.model.Role;
+import com.woorea.openstack.keystone.v3.model.Roles;
+import com.woorea.openstack.keystone.v3.model.Users;
+
+public class RolesResource extends GenericResource<Role, Roles> {
+
+       public RolesResource(OpenStackClient client) {
+               super(client, "/roles", Role.class, Roles.class);
+       }
+       
+       public OpenStackRequest<Users> users(String domainId, String userId) {
+               return CLIENT.get(new StringBuilder(path).append("/").append(domainId).append("/users/").append(userId).append("/roles").toString(), Users.class);
+       }
+
+}
diff --git a/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/ServicesResource.java b/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/ServicesResource.java
new file mode 100644 (file)
index 0000000..4742a2f
--- /dev/null
@@ -0,0 +1,13 @@
+package com.woorea.openstack.keystone.v3.api;
+
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.keystone.model.Service;
+import com.woorea.openstack.keystone.model.Services;
+
+public class ServicesResource extends GenericResource<Service, Services> {
+
+       public ServicesResource(OpenStackClient client) {
+               super(client, "/services", Service.class, Services.class);
+       }
+
+}
diff --git a/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/TokensResource.java b/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/TokensResource.java
new file mode 100644 (file)
index 0000000..c2d53b3
--- /dev/null
@@ -0,0 +1,42 @@
+package com.woorea.openstack.keystone.v3.api;
+
+import com.woorea.openstack.base.client.Entity;
+import com.woorea.openstack.base.client.HttpMethod;
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.keystone.v3.model.Authentication;
+import com.woorea.openstack.keystone.v3.model.Token;
+
+public class TokensResource {
+       
+       private final OpenStackClient CLIENT;
+       
+       public TokensResource(OpenStackClient client) {
+               CLIENT = client;
+       }
+       
+       public Authenticate authenticate(Authentication authentication) {
+               return new Authenticate(authentication);
+       }
+       
+       public OpenStackRequest<Token> show() {
+               return CLIENT.get("/auth/tokens", Token.class);
+       }
+
+       public class Authenticate extends OpenStackRequest<Token> {
+               
+               private Authentication authentication;
+               
+               public Authenticate() {
+                       
+               }
+               
+               public Authenticate(Authentication authentication) {
+                       super(CLIENT, HttpMethod.POST, "/auth/tokens", Entity.json(authentication), Token.class);
+                       this.authentication = authentication;
+               }
+
+       }
+       
+}
+
diff --git a/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/UsersResource.java b/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/UsersResource.java
new file mode 100644 (file)
index 0000000..d6a6d14
--- /dev/null
@@ -0,0 +1,27 @@
+package com.woorea.openstack.keystone.v3.api;
+
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.keystone.model.Services;
+import com.woorea.openstack.keystone.v3.model.User;
+import com.woorea.openstack.keystone.v3.model.Users;
+
+public class UsersResource extends GenericResource<User, Users> {
+
+       public UsersResource(OpenStackClient client) {
+               super(client, "/users", User.class, Users.class);
+       }
+       
+       public OpenStackRequest<Services> groups(String userId) {
+               return CLIENT.get(new StringBuilder(path).append("/").append(userId).append("/groups").toString(), Services.class);
+       }
+       
+       public OpenStackRequest<Services> projects(String userId) {
+               return CLIENT.get(new StringBuilder(path).append("/").append(userId).append("/projects").toString(), Services.class);
+       }
+       
+       public OpenStackRequest<Services> roles(String userId) {
+               return CLIENT.get(new StringBuilder(path).append("/").append(userId).append("/roles").toString(), Services.class);
+       }
+
+}
diff --git a/keystone-model/pom.xml b/keystone-model/pom.xml
new file mode 100644 (file)
index 0000000..512e40b
--- /dev/null
@@ -0,0 +1,13 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+       <modelVersion>4.0.0</modelVersion>
+       <parent>
+               <groupId>org.openecomp.mso.libs</groupId>
+               <artifactId>openstack-java-sdk</artifactId>
+               <version>1.0.0-SNAPSHOT</version>
+       </parent>
+       <groupId>org.openecomp.mso.libs.openstack-java-sdk</groupId>
+       <artifactId>keystone-model</artifactId>
+       <name>OpenStack Keystone Model</name>
+       <description>OpenStack Keystone Model</description>
+
+</project>
\ No newline at end of file
diff --git a/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Access.java b/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Access.java
new file mode 100644 (file)
index 0000000..a7968ff
--- /dev/null
@@ -0,0 +1,252 @@
+package com.woorea.openstack.keystone.model;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("access")
+public class Access implements Serializable {
+
+       public static final class Service {
+               
+               @JsonIgnoreProperties(ignoreUnknown=true)
+               public static final class Endpoint {
+                       
+                       private String region;
+                       
+                       private String publicURL;
+                       
+                       private String internalURL;
+                       
+                       private String adminURL;
+
+                       /**
+                        * @return the region
+                        */
+                       public String getRegion() {
+                               return region;
+                       }
+
+                       /**
+                        * @return the publicURL
+                        */
+                       public String getPublicURL() {
+                               return publicURL;
+                       }
+
+                       /**
+                        * @return the internalURL
+                        */
+                       public String getInternalURL() {
+                               return internalURL;
+                       }
+
+                       /**
+                        * @return the adminURL
+                        */
+                       public String getAdminURL() {
+                               return adminURL;
+                       }
+
+                       /* (non-Javadoc)
+                        * @see java.lang.Object#toString()
+                        */
+                       @Override
+                       public String toString() {
+                               return "Endpoint [region=" + region + ", publicURL="
+                                               + publicURL + ", internalURL=" + internalURL
+                                               + ", adminURL=" + adminURL + "]";
+                       }
+                       
+               }
+               
+               private String type;
+               
+               private String name;
+               
+               private List<Endpoint> endpoints;
+               
+               @JsonProperty("endpoints_links")
+               private List<Link> endpointsLinks;
+
+               /**
+                * @return the type
+                */
+               public String getType() {
+                       return type;
+               }
+
+               /**
+                * @return the name
+                */
+               public String getName() {
+                       return name;
+               }
+
+               /**
+                * @return the endpoints
+                */
+               public List<Endpoint> getEndpoints() {
+                       return endpoints;
+               }
+
+               /**
+                * @return the endpointsLinks
+                */
+               public List<Link> getEndpointsLinks() {
+                       return endpointsLinks;
+               }
+
+               /* (non-Javadoc)
+                * @see java.lang.Object#toString()
+                */
+               @Override
+               public String toString() {
+                       return "Service [type=" + type + ", name=" + name + ", endpoints="
+                                       + endpoints + ", endpointsLinks=" + endpointsLinks + "]";
+               }
+               
+       }
+       
+       @JsonIgnoreProperties(ignoreUnknown=true)
+       public static final class User {
+               
+               @JsonIgnoreProperties(ignoreUnknown=true)
+               public static final class Role {
+                       
+                       private String id;
+                       
+                       private String name;
+
+                       /**
+                        * @return the id
+                        */
+                       public String getId() {
+                               return id;
+                       }
+
+                       /**
+                        * @return the name
+                        */
+                       public String getName() {
+                               return name;
+                       }
+
+                       /* (non-Javadoc)
+                        * @see java.lang.Object#toString()
+                        */
+                       @Override
+                       public String toString() {
+                               return "Role [id=" + id + ", name=" + name + "]";
+                       }
+                       
+               }
+               
+               private String id;
+               
+               private String name;
+               
+               private String username;
+               
+               private List<Role> roles;
+               
+               @JsonProperty("roles_links")
+               private List<Link> rolesLinks;
+
+               /**
+                * @return the id
+                */
+               public String getId() {
+                       return id;
+               }
+
+               /**
+                * @return the name
+                */
+               public String getName() {
+                       return name;
+               }
+
+               /**
+                * @return the username
+                */
+               public String getUsername() {
+                       return username;
+               }
+
+               /**
+                * @return the roles
+                */
+               public List<Role> getRoles() {
+                       return roles;
+               }
+
+               /**
+                * @return the rolesLinks
+                */
+               public List<Link> getRolesLinks() {
+                       return rolesLinks;
+               }
+
+               /* (non-Javadoc)
+                * @see java.lang.Object#toString()
+                */
+               @Override
+               public String toString() {
+                       return "User [id=" + id + ", name=" + name + ", username="
+                                       + username + ", roles=" + roles + ", rolesLinks="
+                                       + rolesLinks + "]";
+               }
+               
+       }
+       
+       private Token token;
+       
+       private List<Service> serviceCatalog;
+       
+       private User user;
+       
+       private Map<String, Object> metadata;
+
+       /**
+        * @return the token
+        */
+       public Token getToken() {
+               return token;
+       }
+
+       /**
+        * @return the serviceCatalog
+        */
+       public List<Service> getServiceCatalog() {
+               return serviceCatalog;
+       }
+
+       /**
+        * @return the user
+        */
+       public User getUser() {
+               return user;
+       }
+
+       /**
+        * @return the metadata
+        */
+       public Map<String, Object> getMetadata() {
+               return metadata;
+       }
+
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Access [token=" + token + ", serviceCatalog=" + serviceCatalog
+                               + ", user=" + user + ", metadata=" + metadata + "]";
+       }
+       
+}
diff --git a/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Authentication.java b/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Authentication.java
new file mode 100644 (file)
index 0000000..f5c8f5c
--- /dev/null
@@ -0,0 +1,41 @@
+package com.woorea.openstack.keystone.model;
+
+import java.io.Serializable;
+
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+public abstract class Authentication implements Serializable {
+
+       private String tenantId;
+       
+       private String tenantName;
+
+       /**
+        * @return the tenantId
+        */
+       public String getTenantId() {
+               return tenantId;
+       }
+
+       /**
+        * @param tenantId the tenantId to set
+        */
+       public void setTenantId(String tenantId) {
+               this.tenantId = tenantId;
+       }
+
+       /**
+        * @return the tenantName
+        */
+       public String getTenantName() {
+               return tenantName;
+       }
+
+       /**
+        * @param tenantName the tenantName to set
+        */
+       public void setTenantName(String tenantName) {
+               this.tenantName = tenantName;
+       }
+       
+}
diff --git a/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Endpoint.java b/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Endpoint.java
new file mode 100644 (file)
index 0000000..f179e25
--- /dev/null
@@ -0,0 +1,121 @@
+package com.woorea.openstack.keystone.model;
+
+import java.io.Serializable;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("endpoint")
+public class Endpoint implements Serializable {
+
+       private String id;
+       
+       @JsonProperty("service_id")
+       private String serviceId;
+       
+       private String region;
+       
+       @JsonProperty("publicurl")
+       private String publicURL;
+       
+       @JsonProperty("internalurl")
+       private String internalURL;
+       
+       @JsonProperty("adminurl")
+       private String adminURL;
+
+       /**
+        * @return the id
+        */
+       public String getId() {
+               return id;
+       }
+
+       /**
+        * @param id the id to set
+        */
+       public void setId(String id) {
+               this.id = id;
+       }
+
+       /**
+        * @return the serviceId
+        */
+       public String getServiceId() {
+               return serviceId;
+       }
+
+       /**
+        * @param serviceId the serviceId to set
+        */
+       public void setServiceId(String serviceId) {
+               this.serviceId = serviceId;
+       }
+
+       /**
+        * @return the region
+        */
+       public String getRegion() {
+               return region;
+       }
+
+       /**
+        * @param region the region to set
+        */
+       public void setRegion(String region) {
+               this.region = region;
+       }
+
+       /**
+        * @return the publicURL
+        */
+       public String getPublicURL() {
+               return publicURL;
+       }
+
+       /**
+        * @param publicURL the publicURL to set
+        */
+       public void setPublicURL(String publicURL) {
+               this.publicURL = publicURL;
+       }
+
+       /**
+        * @return the internalURL
+        */
+       public String getInternalURL() {
+               return internalURL;
+       }
+
+       /**
+        * @param internalURL the internalURL to set
+        */
+       public void setInternalURL(String internalURL) {
+               this.internalURL = internalURL;
+       }
+
+       /**
+        * @return the adminURL
+        */
+       public String getAdminURL() {
+               return adminURL;
+       }
+
+       /**
+        * @param adminURL the adminURL to set
+        */
+       public void setAdminURL(String adminURL) {
+               this.adminURL = adminURL;
+       }
+
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Endpoint [id=" + id + ", serviceId=" + serviceId + ", region="
+                               + region + ", publicURL=" + publicURL + ", internalURL="
+                               + internalURL + ", adminURL=" + adminURL + "]";
+       }
+       
+}
diff --git a/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Endpoints.java b/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Endpoints.java
new file mode 100644 (file)
index 0000000..d7a5898
--- /dev/null
@@ -0,0 +1,34 @@
+package com.woorea.openstack.keystone.model;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class Endpoints implements Iterable<Endpoint>, Serializable {
+
+       @JsonProperty("endpoints")
+       private List<Endpoint> list;
+
+       /**
+        * @return the list
+        */
+       public List<Endpoint> getList() {
+               return list;
+       }
+       
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Endpoints [list=" + list + "]";
+       }
+
+       @Override
+       public Iterator<Endpoint> iterator() {
+               return list.iterator();
+       }
+       
+}
diff --git a/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Error.java b/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Error.java
new file mode 100644 (file)
index 0000000..5549f4c
--- /dev/null
@@ -0,0 +1,46 @@
+package com.woorea.openstack.keystone.model;
+
+import java.io.Serializable;
+
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("error")
+public class Error implements Serializable {
+
+       private Integer code;
+       
+       private String title;
+       
+       private String message;
+
+       /**
+        * @return the code
+        */
+       public Integer getCode() {
+               return code;
+       }
+
+       /**
+        * @return the title
+        */
+       public String getTitle() {
+               return title;
+       }
+
+       /**
+        * @return the message
+        */
+       public String getMessage() {
+               return message;
+       }
+
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Error [code=" + code + ", title=" + title + ", message="
+                               + message + "]";
+       }
+       
+}
diff --git a/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Link.java b/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Link.java
new file mode 100644 (file)
index 0000000..a673bca
--- /dev/null
@@ -0,0 +1,42 @@
+package com.woorea.openstack.keystone.model;
+
+import java.io.Serializable;
+
+public class Link implements Serializable {
+
+       private String rel;
+       
+       private String href;
+       
+       private String type;
+
+       /**
+        * @return the rel
+        */
+       public String getRel() {
+               return rel;
+       }
+
+       /**
+        * @return the href
+        */
+       public String getHref() {
+               return href;
+       }
+
+       /**
+        * @return the type
+        */
+       public String getType() {
+               return type;
+       }
+
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Link [rel=" + rel + ", href=" + href + ", type=" + type + "]";
+       }
+       
+}
diff --git a/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Metadata.java b/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Metadata.java
new file mode 100644 (file)
index 0000000..295f9cd
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * ============LICENSE_START==========================================
+ * ===================================================================
+ * Copyright Â© 2017 AT&T Intellectual Property. All rights reserved.
+ * ===================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ *
+ */
+
+package com.woorea.openstack.keystone.model;
+
+import java.util.Map;
+
+/**
+ * Metadata extension for Tenants as implemented by DCP/LCP.
+ * 
+ * NOTE: This is NOT supported by native Openstack
+ */
+public class Metadata {
+
+       private Map<String, String> metadata;
+
+       /**
+        * @return the metadata
+        */
+       public Map<String, String> getMetadata() {
+               return metadata;
+       }
+
+       /**
+        * Set the metadata
+        * @param metadata
+        */
+       public void setMetadata(Map<String, String> metadata) {
+               this.metadata = metadata;
+       }
+       
+
+       
+}
diff --git a/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Role.java b/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Role.java
new file mode 100644 (file)
index 0000000..993b0d9
--- /dev/null
@@ -0,0 +1,67 @@
+package com.woorea.openstack.keystone.model;
+
+import java.io.Serializable;
+
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("role")
+public class Role implements Serializable {
+
+       private String id;
+       
+       private String name;
+       
+       private String description;
+       
+       private String enabled;
+
+       /**
+        * @return the id
+        */
+       public String getId() {
+               return id;
+       }
+
+       /**
+        * @return the name
+        */
+       public String getName() {
+               return name;
+       }
+
+       /**
+        * @param name the name to set
+        */
+       public void setName(String name) {
+               this.name = name;
+       }
+
+       /**
+        * @return the description
+        */
+       public String getDescription() {
+               return description;
+       }
+
+       /**
+        * @param description the description to set
+        */
+       public void setDescription(String description) {
+               this.description = description;
+       }
+
+       /**
+        * @return the enabled
+        */
+       public String getEnabled() {
+               return enabled;
+       }
+
+       /**
+        * @param enabled the enabled to set
+        */
+       public void setEnabled(String enabled) {
+               this.enabled = enabled;
+       }
+
+}
diff --git a/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Roles.java b/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Roles.java
new file mode 100644 (file)
index 0000000..22e18ed
--- /dev/null
@@ -0,0 +1,34 @@
+package com.woorea.openstack.keystone.model;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class Roles implements Iterable<Role>, Serializable {
+
+       @JsonProperty("roles")
+       private List<Role> list;
+
+       /**
+        * @return the list
+        */
+       public List<Role> getList() {
+               return list;
+       }
+       
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Roles [list=" + list + "]";
+       }
+
+       @Override
+       public Iterator<Role> iterator() {
+               return list.iterator();
+       }
+       
+}
diff --git a/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Service.java b/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Service.java
new file mode 100644 (file)
index 0000000..ed9eb53
--- /dev/null
@@ -0,0 +1,76 @@
+package com.woorea.openstack.keystone.model;
+
+import java.io.Serializable;
+
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("OS-KSADM:service")
+public class Service implements Serializable {
+
+       private String id;
+       
+       private String type;
+       
+       private String name;
+       
+       private String description;
+
+       /**
+        * @return the id
+        */
+       public String getId() {
+               return id;
+       }
+
+       /**
+        * @return the type
+        */
+       public String getType() {
+               return type;
+       }
+
+       /**
+        * @param type the type to set
+        */
+       public void setType(String type) {
+               this.type = type;
+       }
+
+       /**
+        * @return the name
+        */
+       public String getName() {
+               return name;
+       }
+
+       /**
+        * @param name the name to set
+        */
+       public void setName(String name) {
+               this.name = name;
+       }
+
+       /**
+        * @return the description
+        */
+       public String getDescription() {
+               return description;
+       }
+
+       /**
+        * @param description the description to set
+        */
+       public void setDescription(String description) {
+               this.description = description;
+       }
+
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Service [id=" + id + ", type=" + type + ", name=" + name
+                               + ", description=" + description + "]";
+       }
+       
+}
diff --git a/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Services.java b/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Services.java
new file mode 100644 (file)
index 0000000..5c7958c
--- /dev/null
@@ -0,0 +1,34 @@
+package com.woorea.openstack.keystone.model;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class Services implements Iterable<Service>,  Serializable {
+
+       @JsonProperty("OS-KSADM:services")
+       private List<Service> list;
+
+       /**
+        * @return the list
+        */
+       public List<Service> getList() {
+               return list;
+       }
+       
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Services [list=" + list + "]";
+       }
+
+       @Override
+       public Iterator<Service> iterator() {
+               return list.iterator();
+       }
+       
+}
diff --git a/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Tenant.java b/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Tenant.java
new file mode 100644 (file)
index 0000000..a20b71b
--- /dev/null
@@ -0,0 +1,102 @@
+package com.woorea.openstack.keystone.model;
+
+import java.io.Serializable;
+
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("tenant")
+@JsonIgnoreProperties(ignoreUnknown=true)
+public class Tenant implements Serializable {
+
+       private String id;
+       
+       private String name;
+       
+       private String description;
+       
+       private Boolean enabled;
+       
+       public Tenant(String name, String description, Boolean enabled) {
+               this.name = name;
+               this.description = description;
+               this.enabled = enabled;
+       }
+       
+       public Tenant(String name, String description) {
+               this(name, description, Boolean.TRUE);
+       }
+       
+       public Tenant(String name) {
+               this(name, null);
+       }
+       
+       public Tenant() {
+       }
+
+       /**
+        * @return the id
+        */
+       public String getId() {
+               return id;
+       }
+
+       /**
+        * @param id the id to set
+        */
+       public void setId(String id) {
+               this.id = id;
+       }
+
+       /**
+        * @return the name
+        */
+       public String getName() {
+               return name;
+       }
+
+       /**
+        * @param name the name to set
+        */
+       public void setName(String name) {
+               this.name = name;
+       }
+
+       /**
+        * @return the description
+        */
+       public String getDescription() {
+               return description;
+       }
+
+       /**
+        * @param description the description to set
+        */
+       public void setDescription(String description) {
+               this.description = description;
+       }
+
+       /**
+        * @return the enabled
+        */
+       public Boolean getEnabled() {
+               return enabled;
+       }
+
+       /**
+        * @param enabled the enabled to set
+        */
+       public void setEnabled(Boolean enabled) {
+               this.enabled = enabled;
+       }
+
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Tenant [id=" + id + ", name=" + name + ", description="
+                               + description + ", enabled=" + enabled + "]";
+       }
+       
+}
diff --git a/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Tenants.java b/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Tenants.java
new file mode 100644 (file)
index 0000000..51e370c
--- /dev/null
@@ -0,0 +1,44 @@
+package com.woorea.openstack.keystone.model;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class Tenants implements Iterable<Tenant>, Serializable {
+
+       @JsonProperty("tenants")
+       private List<Tenant> list;
+       
+       @JsonProperty("tenants_links")
+       private List<Link> links;
+
+       /**
+        * @return the list
+        */
+       public List<Tenant> getList() {
+               return list;
+       }
+
+       /**
+        * @return the links
+        */
+       public List<Link> getLinks() {
+               return links;
+       }
+
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Tenants [list=" + list + ", links=" + links + "]";
+       }
+
+       @Override
+       public Iterator<Tenant> iterator() {
+               return list.iterator();
+       }
+       
+}
diff --git a/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Token.java b/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Token.java
new file mode 100644 (file)
index 0000000..92d34ee
--- /dev/null
@@ -0,0 +1,52 @@
+package com.woorea.openstack.keystone.model;
+
+import java.util.Calendar;
+
+public final class Token {
+
+       private String id;
+
+       private Calendar issued_at;
+
+       private Calendar expires;
+
+       private Tenant tenant;
+
+       /**
+        * @return the id
+        */
+       public String getId() {
+               return id;
+       }
+
+       /**
+        * @return the issued_at
+        */
+       public Calendar getIssued_at() {
+         return issued_at;
+       }
+
+       /**
+        * @return the expires
+        */
+       public Calendar getExpires() {
+               return expires;
+       }
+
+       /**
+        * @return the tenant
+        */
+       public Tenant getTenant() {
+               return tenant;
+       }
+
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Token [id=" + id + ", Issued_at=" + issued_at + ", expires=" + expires + ", tenant="
+          + tenant + "]";
+       }
+
+}
\ No newline at end of file
diff --git a/keystone-model/src/main/java/com/woorea/openstack/keystone/model/User.java b/keystone-model/src/main/java/com/woorea/openstack/keystone/model/User.java
new file mode 100644 (file)
index 0000000..ad0b788
--- /dev/null
@@ -0,0 +1,139 @@
+package com.woorea.openstack.keystone.model;
+
+/*
+ * Modifications copyright (c) 2017 AT&T Intellectual Property
+ */
+
+import java.io.Serializable;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("user")
+public class User implements Serializable {
+
+       private String id;
+       
+       private String username;
+       
+//     @JsonProperty("OS-KSADM:password")
+//     @JsonProperty("OS_KSADM_password")
+       private String password;
+       
+       private String tenantId;
+       
+       private String name;
+       
+       private String email;
+       
+       private Boolean enabled;
+
+       /**
+        * @return the id
+        */
+       public String getId() {
+               return id;
+       }
+
+       /**
+        * @param id the id to set
+        */
+       public void setId(String id) {
+               this.id = id;
+       }
+
+       /**
+        * @return the username
+        */
+       public String getUsername() {
+               return username;
+       }
+
+       /**
+        * @param username the username to set
+        */
+       public void setUsername(String username) {
+               this.username = username;
+       }
+
+       /**
+        * @return the password
+        */
+       public String getPassword() {
+               return password;
+       }
+
+       /**
+        * @param password the password to set
+        */
+       public void setPassword(String password) {
+               this.password = password;
+       }
+
+       /**
+        * @return the tenantId
+        */
+       public String getTenantId() {
+               return tenantId;
+       }
+
+       /**
+        * @param tenantId the tenantId to set
+        */
+       public void setTenantId(String tenantId) {
+               this.tenantId = tenantId;
+       }
+
+       /**
+        * @return the name
+        */
+       public String getName() {
+               return name;
+       }
+
+       /**
+        * @param name the name to set
+        */
+       public void setName(String name) {
+               this.name = name;
+       }
+
+       /**
+        * @return the email
+        */
+       public String getEmail() {
+               return email;
+       }
+
+       /**
+        * @param email the email to set
+        */
+       public void setEmail(String email) {
+               this.email = email;
+       }
+
+       /**
+        * @return the enabled
+        */
+       public Boolean getEnabled() {
+               return enabled;
+       }
+
+       /**
+        * @param enabled the enabled to set
+        */
+       public void setEnabled(Boolean enabled) {
+               this.enabled = enabled;
+       }
+
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "User [id=" + id + ", username=" + username + ", password="
+                               + password + ", tenantId=" + tenantId + ", name=" + name
+                               + ", email=" + email + ", enabled=" + enabled + "]";
+       }
+       
+}
diff --git a/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Users.java b/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Users.java
new file mode 100644 (file)
index 0000000..c88aabc
--- /dev/null
@@ -0,0 +1,34 @@
+package com.woorea.openstack.keystone.model;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class Users implements Iterable<User>, Serializable {
+
+       @JsonProperty("users")
+       private List<User> list;
+
+       /**
+        * @return the list
+        */
+       public List<User> getList() {
+               return list;
+       }
+       
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Users [list=" + list + "]";
+       }
+
+       @Override
+       public Iterator<User> iterator() {
+               return list.iterator();
+       }
+       
+}
diff --git a/keystone-model/src/main/java/com/woorea/openstack/keystone/model/authentication/AccessKey.java b/keystone-model/src/main/java/com/woorea/openstack/keystone/model/authentication/AccessKey.java
new file mode 100644 (file)
index 0000000..4767450
--- /dev/null
@@ -0,0 +1,72 @@
+package com.woorea.openstack.keystone.model.authentication;
+
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+import com.woorea.openstack.keystone.model.Authentication;
+
+@JsonRootName("auth")
+public class AccessKey extends Authentication {
+       
+       public static final class ApiAccessKeyCredentials {
+               
+               private String accessKey;
+               
+               private String secretKey;
+
+               /**
+                * @return the accessKey
+                */
+               public String getAccessKey() {
+                       return accessKey;
+               }
+
+               /**
+                * @param accessKey the accessKey to set
+                */
+               public void setAccessKey(String accessKey) {
+                       this.accessKey = accessKey;
+               }
+
+               /**
+                * @return the secretKey
+                */
+               public String getSecretKey() {
+                       return secretKey;
+               }
+
+               /**
+                * @param secretKey the secretKey to set
+                */
+               public void setSecretKey(String secretKey) {
+                       this.secretKey = secretKey;
+               }
+               
+       }
+       
+       private ApiAccessKeyCredentials apiAccessKeyCredentials = new ApiAccessKeyCredentials();
+       
+       public AccessKey() {
+               
+       }
+       
+       public AccessKey(String accessKey, String secretKey) {
+               apiAccessKeyCredentials.setAccessKey(accessKey);
+               apiAccessKeyCredentials.setSecretKey(secretKey);
+       }
+
+       /**
+        * @return the apiAccessKeyCredentials
+        */
+       public ApiAccessKeyCredentials getApiAccessKeyCredentials() {
+               return apiAccessKeyCredentials;
+       }
+
+       /**
+        * @param apiAccessKeyCredentials the apiAccessKeyCredentials to set
+        */
+       public void setApiAccessKeyCredentials(
+                       ApiAccessKeyCredentials apiAccessKeyCredentials) {
+               this.apiAccessKeyCredentials = apiAccessKeyCredentials;
+       }
+       
+}
diff --git a/keystone-model/src/main/java/com/woorea/openstack/keystone/model/authentication/RackspaceAuthentication.java b/keystone-model/src/main/java/com/woorea/openstack/keystone/model/authentication/RackspaceAuthentication.java
new file mode 100644 (file)
index 0000000..7007d02
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ * ============LICENSE_START==========================================
+ * ===================================================================
+ * Copyright Â© 2017 AT&T Intellectual Property. All rights reserved.
+ * ===================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ *
+ */
+
+package com.woorea.openstack.keystone.model.authentication;
+
+import org.codehaus.jackson.annotate.JsonIgnore;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+import com.woorea.openstack.keystone.model.Authentication;
+
+@JsonRootName("auth")
+public class RackspaceAuthentication extends Authentication {
+               
+       /**
+        * 
+        */
+       private static final long serialVersionUID = 5451283386875662918L;
+
+       @JsonIgnore
+       private String tenantId;
+       
+       @JsonIgnore
+       private String tenantName;
+       
+       public static final class Token {
+               
+               private String username;
+               private String apiKey;
+
+               /**
+                * @return the username
+                */
+               public String getUsername() {
+                       return username;
+               }
+               /**
+                * @param username the username to set
+                */
+               public void setUsername(String username) {
+                       this.username = username;
+               }
+               /**
+                * @return the apiKey
+                */
+               public String getApiKey() {
+                       return apiKey;
+               }
+               /**
+                * @param apiKey the apiKey to set
+                */
+               public void setApiKey(String apiKey) {
+                       this.apiKey = apiKey;
+               }
+       }
+       
+       @JsonProperty("RAX-KSKEY:apiKeyCredentials")
+       private Token token = new Token();
+       
+       public RackspaceAuthentication (String username, String apiKey) {
+               this.token.username = username;
+               this.token.apiKey = apiKey;
+       
+       }
+
+       /**
+        * @return the token
+        */
+       public Token getToken() {
+               return token;
+       }
+
+       /**
+        * @param token the token to set
+        */
+       public void setToken(Token token) {
+               this.token = token;
+       }
+       
+}
diff --git a/keystone-model/src/main/java/com/woorea/openstack/keystone/model/authentication/TokenAuthentication.java b/keystone-model/src/main/java/com/woorea/openstack/keystone/model/authentication/TokenAuthentication.java
new file mode 100644 (file)
index 0000000..68cfcd2
--- /dev/null
@@ -0,0 +1,50 @@
+package com.woorea.openstack.keystone.model.authentication;
+
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+import com.woorea.openstack.keystone.model.Authentication;
+
+@JsonRootName("auth")
+public class TokenAuthentication extends Authentication {
+       
+       public static final class Token {
+               
+               private String id;
+
+               /**
+                * @return the id
+                */
+               public String getId() {
+                       return id;
+               }
+
+               /**
+                * @param id the id to set
+                */
+               public void setId(String id) {
+                       this.id = id;
+               }
+               
+       }
+       
+       private Token token = new Token();
+       
+       public TokenAuthentication(String token) {
+               this.token.id = token;
+       }
+
+       /**
+        * @return the token
+        */
+       public Token getToken() {
+               return token;
+       }
+
+       /**
+        * @param token the token to set
+        */
+       public void setToken(Token token) {
+               this.token = token;
+       }
+       
+}
diff --git a/keystone-model/src/main/java/com/woorea/openstack/keystone/model/authentication/UsernamePassword.java b/keystone-model/src/main/java/com/woorea/openstack/keystone/model/authentication/UsernamePassword.java
new file mode 100644 (file)
index 0000000..ee94692
--- /dev/null
@@ -0,0 +1,71 @@
+package com.woorea.openstack.keystone.model.authentication;
+
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+import com.woorea.openstack.keystone.model.Authentication;
+
+@JsonRootName("auth")
+public class UsernamePassword extends Authentication {
+       
+       public static final class PasswordCredentials {
+               
+               private String username;
+               
+               private String password;
+
+               /**
+                * @return the username
+                */
+               public String getUsername() {
+                       return username;
+               }
+
+               /**
+                * @param username the username to set
+                */
+               public void setUsername(String username) {
+                       this.username = username;
+               }
+
+               /**
+                * @return the password
+                */
+               public String getPassword() {
+                       return password;
+               }
+
+               /**
+                * @param password the password to set
+                */
+               public void setPassword(String password) {
+                       this.password = password;
+               }
+               
+       }
+       
+       private PasswordCredentials passwordCredentials = new PasswordCredentials();
+       
+       public UsernamePassword() {
+               
+       }
+       
+       public UsernamePassword(String username, String password) {
+               passwordCredentials.setUsername(username);
+               passwordCredentials.setPassword(password);
+       }
+
+       /**
+        * @return the passwordCredentials
+        */
+       public PasswordCredentials getPasswordCredentials() {
+               return passwordCredentials;
+       }
+
+       /**
+        * @param passwordCredentials the passwordCredentials to set
+        */
+       public void setPasswordCredentials(PasswordCredentials passwordCredentials) {
+               this.passwordCredentials = passwordCredentials;
+       }
+       
+}
diff --git a/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Authentication.java b/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Authentication.java
new file mode 100644 (file)
index 0000000..7caffb0
--- /dev/null
@@ -0,0 +1,284 @@
+package com.woorea.openstack.keystone.v3.model;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("auth")
+public class Authentication implements Serializable {
+       
+       public static final class Identity {
+               
+               public static final Identity password(String userId, String password) {
+                       Identity identity = new Identity();
+                       identity.getMethods().add("password");
+                       Password method = new Password();
+                       method.getUser().setId(userId);
+                       method.getUser().setPassword(password);
+                       identity.setPassword(method);
+                       return identity;
+               }
+               
+               public static final Identity password(String domainName, String username, String password) {
+                       Identity identity = new Identity();
+                       identity.getMethods().add("password");
+                       Password method = new Password();
+                       com.woorea.openstack.keystone.v3.model.Authentication.Identity.Password.User.Domain domain = new com.woorea.openstack.keystone.v3.model.Authentication.Identity.Password.User.Domain();
+                       domain.setName(domainName);
+                       method.getUser().setDomain(domain);
+                       method.getUser().setName(username);
+                       method.getUser().setPassword(password);
+                       identity.setPassword(method);
+                       return identity;
+               }
+               
+               public static final Identity token(String token) {
+                       Identity identity = new Identity();
+                       identity.getMethods().add("token");
+                       Token method = new Token();
+                       method.setId(token);
+                       identity.setToken(method);
+                       return identity;
+               }
+               
+               private List<String> methods = new ArrayList<String>();
+               
+               public static final class Password {
+                       
+                       public static final class User {
+                               
+                               public static final class Domain {
+                                       
+                                       private String id;
+                                       
+                                       private String name;
+
+                                       public String getId() {
+                                               return id;
+                                       }
+
+                                       public void setId(String id) {
+                                               this.id = id;
+                                       }
+
+                                       public String getName() {
+                                               return name;
+                                       }
+
+                                       public void setName(String name) {
+                                               this.name = name;
+                                       }
+                               }
+                               
+                               private Domain domain;
+                               
+                               private String id;
+                               
+                               private String name;
+                               
+                               private String password;
+
+                               public Domain getDomain() {
+                                       return domain;
+                               }
+
+                               public void setDomain(Domain domain) {
+                                       this.domain = domain;
+                               }
+
+                               public String getId() {
+                                       return id;
+                               }
+
+                               public void setId(String id) {
+                                       this.id = id;
+                               }
+
+                               public String getName() {
+                                       return name;
+                               }
+
+                               public void setName(String name) {
+                                       this.name = name;
+                               }
+
+                               public String getPassword() {
+                                       return password;
+                               }
+
+                               public void setPassword(String password) {
+                                       this.password = password;
+                               }
+                               
+                       }
+                       
+                       private User user = new User();
+
+                       public User getUser() {
+                               return user;
+                       }
+
+                       public void setUser(User user) {
+                               this.user = user;
+                       }
+                       
+               }
+               
+               private Password password;
+               
+               public static final class Token {
+                       
+                       private String id;
+
+                       public String getId() {
+                               return id;
+                       }
+
+                       public void setId(String id) {
+                               this.id = id;
+                       }
+                       
+               }
+               
+               private Token token;
+
+               public List<String> getMethods() {
+                       return methods;
+               }
+
+               public void setMethods(List<String> methods) {
+                       this.methods = methods;
+               }
+
+               public Password getPassword() {
+                       return password;
+               }
+
+               public void setPassword(Password password) {
+                       this.password = password;
+               }
+
+               public Token getToken() {
+                       return token;
+               }
+
+               public void setToken(Token token) {
+                       this.token = token;
+               }
+               
+       }
+       
+       private Identity identity;
+       
+       public static final class Scope {
+               
+               public static Scope project(String id) {
+                       Scope scope = new Scope();
+                       Project project = new Project();
+                       project.setId(id);
+                       scope.setProject(project);
+                       return scope;
+               }
+               
+               public static Scope project(String domainName, String projectName) {
+                       Scope scope = new Scope();
+                       com.woorea.openstack.keystone.v3.model.Authentication.Scope.Project.Domain domain = new com.woorea.openstack.keystone.v3.model.Authentication.Scope.Project.Domain();
+                       domain.setName(domainName);
+                       Project project = new Project();
+                       project.setDomain(domain);
+                       project.setName(projectName);
+                       scope.setProject(project);
+                       return scope;
+               }
+               
+               public static final class Project {
+               
+                       public static final class Domain {
+                               
+                               private String id;
+                               
+                               private String name;
+
+                               public String getId() {
+                                       return id;
+                               }
+
+                               public void setId(String id) {
+                                       this.id = id;
+                               }
+
+                               public String getName() {
+                                       return name;
+                               }
+
+                               public void setName(String name) {
+                                       this.name = name;
+                               }
+                       }
+                       
+                       private String id;
+                       
+                       private Domain domain;
+                       
+                       private String name;
+                       
+
+                       public String getId() {
+                               return id;
+                       }
+
+                       public void setId(String id) {
+                               this.id = id;
+                       }
+
+                       public Domain getDomain() {
+                               return domain;
+                       }
+
+                       public void setDomain(Domain domain) {
+                               this.domain = domain;
+                       }
+
+                       public String getName() {
+                               return name;
+                       }
+
+                       public void setName(String name) {
+                               this.name = name;
+                       }
+                       
+               }
+               
+               private Project project;
+
+               public Project getProject() {
+                       return project;
+               }
+
+               public void setProject(Project project) {
+                       this.project = project;
+               }
+               
+       }
+       
+       private Scope scope;
+
+       public Identity getIdentity() {
+               return identity;
+       }
+
+       public void setIdentity(Identity identity) {
+               this.identity = identity;
+       }
+
+       public Scope getScope() {
+               return scope;
+       }
+
+       public void setScope(Scope scope) {
+               this.scope = scope;
+       }
+       
+}
diff --git a/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Credential.java b/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Credential.java
new file mode 100644 (file)
index 0000000..ef40a2a
--- /dev/null
@@ -0,0 +1,61 @@
+package com.woorea.openstack.keystone.v3.model;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("credential")
+public class Credential {
+       
+       private String id;
+
+       private String projectId;
+       
+       private String type;
+       
+       private String userId;
+       
+       private Map<String, String> blob = new HashMap<String, String>();
+
+       public String getId() {
+               return id;
+       }
+
+       public void setId(String id) {
+               this.id = id;
+       }
+
+       public String getProjectId() {
+               return projectId;
+       }
+
+       public void setProjectId(String projectId) {
+               this.projectId = projectId;
+       }
+
+       public String getType() {
+               return type;
+       }
+
+       public void setType(String type) {
+               this.type = type;
+       }
+
+       public String getUserId() {
+               return userId;
+       }
+
+       public void setUserId(String userId) {
+               this.userId = userId;
+       }
+
+       public Map<String, String> getBlob() {
+               return blob;
+       }
+
+       public void setBlob(Map<String, String> blob) {
+               this.blob = blob;
+       }
+       
+}
diff --git a/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Credentials.java b/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Credentials.java
new file mode 100644 (file)
index 0000000..36eeda6
--- /dev/null
@@ -0,0 +1,34 @@
+package com.woorea.openstack.keystone.v3.model;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class Credentials implements Iterable<Credential>,  Serializable {
+
+       @JsonProperty("credentials")
+       private List<Credential> list;
+
+       /**
+        * @return the list
+        */
+       public List<Credential> getList() {
+               return list;
+       }
+       
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Credentials [list=" + list + "]";
+       }
+
+       @Override
+       public Iterator<Credential> iterator() {
+               return list.iterator();
+       }
+       
+}
diff --git a/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Domain.java b/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Domain.java
new file mode 100644 (file)
index 0000000..9df4fe2
--- /dev/null
@@ -0,0 +1,48 @@
+package com.woorea.openstack.keystone.v3.model;
+
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("domain")
+public class Domain {
+
+       private String id;
+       
+       private String name;
+       
+       private String description;
+       
+       private Boolean enabled;
+
+       public String getId() {
+               return id;
+       }
+
+       public void setId(String id) {
+               this.id = id;
+       }
+
+       public String getName() {
+               return name;
+       }
+
+       public void setName(String name) {
+               this.name = name;
+       }
+
+       public String getDescription() {
+               return description;
+       }
+
+       public void setDescription(String description) {
+               this.description = description;
+       }
+       
+       public Boolean getEnabled() {
+               return enabled;
+       }
+
+       public void setEnabled(Boolean enabled) {
+               this.enabled = enabled;
+       }
+       
+}
diff --git a/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Domains.java b/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Domains.java
new file mode 100644 (file)
index 0000000..e42a6c4
--- /dev/null
@@ -0,0 +1,34 @@
+package com.woorea.openstack.keystone.v3.model;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class Domains implements Iterable<Domain>,  Serializable {
+
+       @JsonProperty("domains")
+       private List<Domain> list;
+
+       /**
+        * @return the list
+        */
+       public List<Domain> getList() {
+               return list;
+       }
+       
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Domains [list=" + list + "]";
+       }
+
+       @Override
+       public Iterator<Domain> iterator() {
+               return list.iterator();
+       }
+       
+}
diff --git a/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Endpoint.java b/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Endpoint.java
new file mode 100644 (file)
index 0000000..213e690
--- /dev/null
@@ -0,0 +1,51 @@
+package com.woorea.openstack.keystone.v3.model;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("endpoint")
+public class Endpoint {
+
+       private String id;
+       
+       @JsonProperty("interface")
+       private String iface;
+       
+       private String name;
+       
+       @JsonProperty("service_id")
+       private String serviceId;
+
+       public String getId() {
+               return id;
+       }
+
+       public void setId(String id) {
+               this.id = id;
+       }
+
+       public String getInterface() {
+               return iface;
+       }
+
+       public void setInterface(String iface) {
+               this.iface = iface;
+       }
+
+       public String getName() {
+               return name;
+       }
+
+       public void setName(String name) {
+               this.name = name;
+       }
+
+       public String getServiceId() {
+               return serviceId;
+       }
+
+       public void setServiceId(String serviceId) {
+               this.serviceId = serviceId;
+       }
+       
+}
diff --git a/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Endpoints.java b/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Endpoints.java
new file mode 100644 (file)
index 0000000..146e88b
--- /dev/null
@@ -0,0 +1,34 @@
+package com.woorea.openstack.keystone.v3.model;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class Endpoints implements Iterable<Endpoint>,  Serializable {
+
+       @JsonProperty("endpoints")
+       private List<Endpoint> list;
+
+       /**
+        * @return the list
+        */
+       public List<Endpoint> getList() {
+               return list;
+       }
+       
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Endpoints [list=" + list + "]";
+       }
+
+       @Override
+       public Iterator<Endpoint> iterator() {
+               return list.iterator();
+       }
+       
+}
diff --git a/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Group.java b/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Group.java
new file mode 100644 (file)
index 0000000..5e718b5
--- /dev/null
@@ -0,0 +1,50 @@
+package com.woorea.openstack.keystone.v3.model;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("group")
+public class Group {
+
+       private String id;
+       
+       @JsonProperty("domain_id")
+       private String domainId;
+       
+       private String name;
+       
+       private String description;
+
+       public String getId() {
+               return id;
+       }
+
+       public void setId(String id) {
+               this.id = id;
+       }
+
+       public String getDomainId() {
+               return domainId;
+       }
+
+       public void setDomainId(String domainId) {
+               this.domainId = domainId;
+       }
+
+       public String getName() {
+               return name;
+       }
+
+       public void setName(String name) {
+               this.name = name;
+       }
+
+       public String getDescription() {
+               return description;
+       }
+
+       public void setDescription(String description) {
+               this.description = description;
+       }
+       
+}
diff --git a/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Groups.java b/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Groups.java
new file mode 100644 (file)
index 0000000..cc7b276
--- /dev/null
@@ -0,0 +1,34 @@
+package com.woorea.openstack.keystone.v3.model;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class Groups implements Iterable<Group>,  Serializable {
+
+       @JsonProperty("groups")
+       private List<Group> list;
+
+       /**
+        * @return the list
+        */
+       public List<Group> getList() {
+               return list;
+       }
+       
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Groups [list=" + list + "]";
+       }
+
+       @Override
+       public Iterator<Group> iterator() {
+               return list.iterator();
+       }
+       
+}
diff --git a/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Policies.java b/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Policies.java
new file mode 100644 (file)
index 0000000..42da856
--- /dev/null
@@ -0,0 +1,34 @@
+package com.woorea.openstack.keystone.v3.model;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class Policies implements Iterable<Policy>,  Serializable {
+
+       @JsonProperty("policies")
+       private List<Policy> list;
+
+       /**
+        * @return the list
+        */
+       public List<Policy> getList() {
+               return list;
+       }
+       
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Policies [list=" + list + "]";
+       }
+
+       @Override
+       public Iterator<Policy> iterator() {
+               return list.iterator();
+       }
+       
+}
diff --git a/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Policy.java b/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Policy.java
new file mode 100644 (file)
index 0000000..5abf844
--- /dev/null
@@ -0,0 +1,61 @@
+package com.woorea.openstack.keystone.v3.model;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("policy")
+public class Policy {
+       
+       private String id;
+
+       private String projectId;
+       
+       private String type;
+       
+       private String userId;
+       
+       private Map<String, String> blob = new HashMap<String, String>();
+
+       public String getId() {
+               return id;
+       }
+
+       public void setId(String id) {
+               this.id = id;
+       }
+
+       public String getProjectId() {
+               return projectId;
+       }
+
+       public void setProjectId(String projectId) {
+               this.projectId = projectId;
+       }
+
+       public String getType() {
+               return type;
+       }
+
+       public void setType(String type) {
+               this.type = type;
+       }
+
+       public String getUserId() {
+               return userId;
+       }
+
+       public void setUserId(String userId) {
+               this.userId = userId;
+       }
+
+       public Map<String, String> getBlob() {
+               return blob;
+       }
+
+       public void setBlob(Map<String, String> blob) {
+               this.blob = blob;
+       }
+       
+}
diff --git a/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Project.java b/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Project.java
new file mode 100644 (file)
index 0000000..070336e
--- /dev/null
@@ -0,0 +1,50 @@
+package com.woorea.openstack.keystone.v3.model;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("project")
+public class Project {
+
+       private String id;
+       
+       @JsonProperty("domain_id")
+       private String domainId;
+       
+       private String name;
+       
+       private Boolean enabled;
+
+       public String getId() {
+               return id;
+       }
+
+       public void setId(String id) {
+               this.id = id;
+       }
+
+       public String getDomainId() {
+               return domainId;
+       }
+
+       public void setDomainId(String domainId) {
+               this.domainId = domainId;
+       }
+
+       public String getName() {
+               return name;
+       }
+
+       public void setName(String name) {
+               this.name = name;
+       }
+       
+       public Boolean getEnabled() {
+               return enabled;
+       }
+
+       public void setEnabled(Boolean enabled) {
+               this.enabled = enabled;
+       }
+       
+}
diff --git a/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Projects.java b/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Projects.java
new file mode 100644 (file)
index 0000000..fa39064
--- /dev/null
@@ -0,0 +1,34 @@
+package com.woorea.openstack.keystone.v3.model;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class Projects implements Iterable<Project>,  Serializable {
+
+       @JsonProperty("projects")
+       private List<Project> list;
+
+       /**
+        * @return the list
+        */
+       public List<Project> getList() {
+               return list;
+       }
+       
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Projects [list=" + list + "]";
+       }
+
+       @Override
+       public Iterator<Project> iterator() {
+               return list.iterator();
+       }
+       
+}
diff --git a/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Role.java b/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Role.java
new file mode 100644 (file)
index 0000000..09d47a1
--- /dev/null
@@ -0,0 +1,67 @@
+package com.woorea.openstack.keystone.v3.model;
+
+import java.io.Serializable;
+
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("role")
+public class Role implements Serializable {
+
+       private String id;
+       
+       private String name;
+       
+       private String description;
+       
+       private String enabled;
+
+       /**
+        * @return the id
+        */
+       public String getId() {
+               return id;
+       }
+
+       /**
+        * @return the name
+        */
+       public String getName() {
+               return name;
+       }
+
+       /**
+        * @param name the name to set
+        */
+       public void setName(String name) {
+               this.name = name;
+       }
+
+       /**
+        * @return the description
+        */
+       public String getDescription() {
+               return description;
+       }
+
+       /**
+        * @param description the description to set
+        */
+       public void setDescription(String description) {
+               this.description = description;
+       }
+
+       /**
+        * @return the enabled
+        */
+       public String getEnabled() {
+               return enabled;
+       }
+
+       /**
+        * @param enabled the enabled to set
+        */
+       public void setEnabled(String enabled) {
+               this.enabled = enabled;
+       }
+
+}
diff --git a/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Roles.java b/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Roles.java
new file mode 100644 (file)
index 0000000..5a4e3b4
--- /dev/null
@@ -0,0 +1,34 @@
+package com.woorea.openstack.keystone.v3.model;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class Roles implements Iterable<Role>, Serializable {
+
+       @JsonProperty("roles")
+       private List<Role> list;
+
+       /**
+        * @return the list
+        */
+       public List<Role> getList() {
+               return list;
+       }
+       
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Roles [list=" + list + "]";
+       }
+
+       @Override
+       public Iterator<Role> iterator() {
+               return list.iterator();
+       }
+       
+}
diff --git a/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Service.java b/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Service.java
new file mode 100644 (file)
index 0000000..578f2c1
--- /dev/null
@@ -0,0 +1,48 @@
+package com.woorea.openstack.keystone.v3.model;
+
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("service")
+public class Service {
+
+       private String id;
+       
+       private String type;
+       
+       private String name;
+       
+       private String description;
+
+       public String getId() {
+               return id;
+       }
+
+       public void setId(String id) {
+               this.id = id;
+       }
+
+       public String getType() {
+               return type;
+       }
+
+       public void setType(String type) {
+               this.type = type;
+       }
+
+       public String getName() {
+               return name;
+       }
+
+       public void setName(String name) {
+               this.name = name;
+       }
+
+       public String getDescription() {
+               return description;
+       }
+
+       public void setDescription(String description) {
+               this.description = description;
+       }
+       
+}
diff --git a/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Services.java b/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Services.java
new file mode 100644 (file)
index 0000000..4383aec
--- /dev/null
@@ -0,0 +1,36 @@
+package com.woorea.openstack.keystone.v3.model;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+import com.woorea.openstack.keystone.model.Service;
+
+public class Services implements Iterable<Service>,  Serializable {
+
+       @JsonProperty("services")
+       private List<Service> list;
+
+       /**
+        * @return the list
+        */
+       public List<Service> getList() {
+               return list;
+       }
+       
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Services [list=" + list + "]";
+       }
+
+       @Override
+       public Iterator<Service> iterator() {
+               return list.iterator();
+       }
+       
+}
diff --git a/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Token.java b/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Token.java
new file mode 100644 (file)
index 0000000..aee6fe5
--- /dev/null
@@ -0,0 +1,370 @@
+package com.woorea.openstack.keystone.v3.model;
+
+import java.io.Serializable;
+import java.util.Calendar;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("token")
+@JsonIgnoreProperties(ignoreUnknown=true)
+public class Token implements Serializable {
+       
+       private String id;
+       
+       @JsonProperty("expires_at")
+       private Calendar expiresAt;
+       
+       @JsonProperty("issued_at")
+       private Calendar issuedAt;
+       
+       private List<String> methods;
+       
+       @JsonIgnoreProperties(ignoreUnknown=true)
+       public static final class Domain {
+               
+               private String id;
+               
+               private String name;
+
+               public String getId() {
+                       return id;
+               }
+
+               public void setId(String id) {
+                       this.id = id;
+               }
+
+               public String getName() {
+                       return name;
+               }
+
+               public void setName(String name) {
+                       this.name = name;
+               }
+               
+       }
+       
+       private Domain domain;
+       
+       @JsonIgnoreProperties(ignoreUnknown=true)
+       public static final class Project {
+               
+               private Domain domain;
+               
+               private String id;
+               
+               private String name;
+
+               public Domain getDomain() {
+                       return domain;
+               }
+
+               public void setDomain(Domain domain) {
+                       this.domain = domain;
+               }
+
+               public String getId() {
+                       return id;
+               }
+
+               public void setId(String id) {
+                       this.id = id;
+               }
+
+               public String getName() {
+                       return name;
+               }
+
+               public void setName(String name) {
+                       this.name = name;
+               }
+               
+       }
+       
+       private Project project;
+       
+       @JsonIgnoreProperties(ignoreUnknown=true)
+       public static final class User {
+               
+               @JsonIgnoreProperties(ignoreUnknown=true)
+               private static final class Domain {
+                       
+                       private String id;
+                       
+                       private String name;
+
+                       public String getId() {
+                               return id;
+                       }
+
+                       public void setId(String id) {
+                               this.id = id;
+                       }
+
+                       public String getName() {
+                               return name;
+                       }
+
+                       public void setName(String name) {
+                               this.name = name;
+                       }
+                       
+               }
+               
+               private String id;
+               
+               private String name;
+
+               public String getId() {
+                       return id;
+               }
+
+               public void setId(String id) {
+                       this.id = id;
+               }
+
+               public String getName() {
+                       return name;
+               }
+
+               public void setName(String name) {
+                       this.name = name;
+               }
+               
+       }
+       
+       private User user;
+       
+       @JsonIgnoreProperties(ignoreUnknown=true)
+       public static final class Role {
+               
+               private String id;
+               
+               private String name;
+               
+       }
+       
+       private List<Role> roles;
+       
+       public static final class Service {
+               
+               public static final class Endpoint {
+                       
+                       private String id;
+                       
+                       private String url;
+                       
+                       private String region;
+                       
+                       private Boolean enabled;
+                       
+                       @JsonProperty("legacy_endpoint_id")
+                       private String legacyEndpointId;
+                       
+                       @JsonProperty("interface")
+                       private String iface;
+
+                       public String getId() {
+                               return id;
+                       }
+
+                       public void setId(String id) {
+                               this.id = id;
+                       }
+
+                       public String getUrl() {
+                               return url;
+                       }
+
+                       public void setUrl(String url) {
+                               this.url = url;
+                       }
+
+                       public String getRegion() {
+                               return region;
+                       }
+
+                       public void setRegion(String region) {
+                               this.region = region;
+                       }
+
+                       public Boolean getEnabled() {
+                               return enabled;
+                       }
+
+                       public void setEnabled(Boolean enabled) {
+                               this.enabled = enabled;
+                       }
+
+                       public String getLegacyEndpointId() {
+                               return legacyEndpointId;
+                       }
+
+                       public void setLegacyEndpointId(String legacyEndpointId) {
+                               this.legacyEndpointId = legacyEndpointId;
+                       }
+
+                       public String getInterface() {
+                               return iface;
+                       }
+
+                       public void setInterface(String iface) {
+                               this.iface = iface;
+                       }
+                       
+               }
+               
+               private String id;
+               
+               private String type;
+               
+               private List<Endpoint> endpoints;
+
+               public String getId() {
+                       return id;
+               }
+
+               public void setId(String id) {
+                       this.id = id;
+               }
+
+               public String getType() {
+                       return type;
+               }
+
+               public void setType(String type) {
+                       this.type = type;
+               }
+
+               public List<Endpoint> getEndpoints() {
+                       return endpoints;
+               }
+
+               public void setEndpoints(List<Endpoint> endpoints) {
+                       this.endpoints = endpoints;
+               }
+               
+       }
+       
+       private List<Service> catalog;
+
+
+       public String getId() {
+               return id;
+       }
+
+
+
+       public void setId(String id) {
+               this.id = id;
+       }
+
+
+
+       public Calendar getExpiresAt() {
+               return expiresAt;
+       }
+
+
+
+       public void setExpiresAt(Calendar expiresAt) {
+               this.expiresAt = expiresAt;
+       }
+
+
+
+       public Calendar getIssuedAt() {
+               return issuedAt;
+       }
+
+
+
+       public void setIssuedAt(Calendar issuedAt) {
+               this.issuedAt = issuedAt;
+       }
+
+
+
+       public List<String> getMethods() {
+               return methods;
+       }
+
+
+
+       public void setMethods(List<String> methods) {
+               this.methods = methods;
+       }
+
+
+
+       public Domain getDomain() {
+               return domain;
+       }
+
+
+
+       public void setDomain(Domain domain) {
+               this.domain = domain;
+       }
+
+
+
+       public Project getProject() {
+               return project;
+       }
+
+
+
+       public void setProject(Project project) {
+               this.project = project;
+       }
+
+
+
+       public User getUser() {
+               return user;
+       }
+
+
+
+       public void setUser(User user) {
+               this.user = user;
+       }
+
+
+
+       public List<Role> getRoles() {
+               return roles;
+       }
+
+
+
+       public void setRoles(List<Role> roles) {
+               this.roles = roles;
+       }
+
+
+
+       public List<Service> getCatalog() {
+               return catalog;
+       }
+
+
+
+       public void setCatalog(List<Service> catalog) {
+               this.catalog = catalog;
+       }
+
+       
+       @Override
+       public String toString() {
+               return "Token [id=" + id + ", expiresAt=" + expiresAt + ", issuedAt="
+                               + issuedAt + ", methods=" + methods + ", domain=" + domain
+                               + ", project=" + project + ", user=" + user + ", roles="
+                               + roles + ", catalog=" + catalog + "]";
+       }
+
+}
diff --git a/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/User.java b/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/User.java
new file mode 100644 (file)
index 0000000..3b1787b
--- /dev/null
@@ -0,0 +1,91 @@
+package com.woorea.openstack.keystone.v3.model;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("user")
+public class User {
+
+       private String id;
+       
+       @JsonProperty("domain_id")
+       private String domainId;
+       
+       @JsonProperty("default_project_id")
+       private String defaultProjectId;
+       
+       private String name;
+       
+       private String password;
+       
+       private String email;
+       
+       private String description;
+       
+       private Boolean enabled;
+
+       public String getId() {
+               return id;
+       }
+
+       public void setId(String id) {
+               this.id = id;
+       }
+
+       public String getDomainId() {
+               return domainId;
+       }
+
+       public void setDomainId(String domainId) {
+               this.domainId = domainId;
+       }
+
+       public String getDefaultProjectId() {
+               return defaultProjectId;
+       }
+
+       public void setDefaultProjectId(String defaultProjectId) {
+               this.defaultProjectId = defaultProjectId;
+       }
+
+       public String getName() {
+               return name;
+       }
+
+       public void setName(String name) {
+               this.name = name;
+       }
+
+       public String getPassword() {
+               return password;
+       }
+
+       public void setPassword(String password) {
+               this.password = password;
+       }
+
+       public String getEmail() {
+               return email;
+       }
+
+       public void setEmail(String email) {
+               this.email = email;
+       }
+
+       public String getDescription() {
+               return description;
+       }
+
+       public void setDescription(String description) {
+               this.description = description;
+       }
+
+       public Boolean getEnabled() {
+               return enabled;
+       }
+
+       public void setEnabled(Boolean enabled) {
+               this.enabled = enabled;
+       }
+       
+}
diff --git a/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Users.java b/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Users.java
new file mode 100644 (file)
index 0000000..fa3c6d4
--- /dev/null
@@ -0,0 +1,36 @@
+package com.woorea.openstack.keystone.v3.model;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+import com.woorea.openstack.keystone.model.User;
+
+public class Users implements Iterable<User>,  Serializable {
+
+       @JsonProperty("users")
+       private List<User> list;
+
+       /**
+        * @return the list
+        */
+       public List<User> getList() {
+               return list;
+       }
+       
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Users [list=" + list + "]";
+       }
+
+       @Override
+       public Iterator<User> iterator() {
+               return list.iterator();
+       }
+       
+}
diff --git a/nova-client/pom.xml b/nova-client/pom.xml
new file mode 100644 (file)
index 0000000..d25fc05
--- /dev/null
@@ -0,0 +1,24 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+       <modelVersion>4.0.0</modelVersion>
+       <parent>
+               <groupId>org.openecomp.mso.libs</groupId>
+               <artifactId>openstack-java-sdk</artifactId>
+               <version>1.0.0-SNAPSHOT</version>
+       </parent>
+       <groupId>org.openecomp.mso.libs.openstack-java-sdk</groupId>
+       <artifactId>nova-client</artifactId>
+       <name>OpenStack Nova Client</name>
+       <description>OpenStack Nova Client</description>
+       <dependencies>
+               <dependency>
+                       <groupId>org.openecomp.mso.libs.openstack-java-sdk</groupId>
+                       <artifactId>openstack-client</artifactId>
+                       <version>1.0.0-SNAPSHOT</version>
+               </dependency>
+               <dependency>
+                       <groupId>org.openecomp.mso.libs.openstack-java-sdk</groupId>
+                       <artifactId>nova-model</artifactId>
+                       <version>1.0.0-SNAPSHOT</version>
+               </dependency>
+       </dependencies>
+</project>
\ No newline at end of file
diff --git a/nova-client/src/main/java/com/woorea/openstack/nova/Nova.java b/nova-client/src/main/java/com/woorea/openstack/nova/Nova.java
new file mode 100644 (file)
index 0000000..f81de7d
--- /dev/null
@@ -0,0 +1,113 @@
+package com.woorea.openstack.nova;
+
+
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackClientConnector;
+import com.woorea.openstack.nova.api.ExtensionsResource;
+import com.woorea.openstack.nova.api.FlavorsResource;
+import com.woorea.openstack.nova.api.ImagesResource;
+import com.woorea.openstack.nova.api.QuotaSetsResource;
+import com.woorea.openstack.nova.api.ServersResource;
+import com.woorea.openstack.nova.api.extensions.AggregatesExtension;
+import com.woorea.openstack.nova.api.extensions.FloatingIpsExtension;
+import com.woorea.openstack.nova.api.extensions.KeyPairsExtension;
+import com.woorea.openstack.nova.api.extensions.SecurityGroupsExtension;
+import com.woorea.openstack.nova.api.extensions.SnapshotsExtension;
+import com.woorea.openstack.nova.api.extensions.VolumesExtension;
+import com.woorea.openstack.nova.api.extensions.HostsExtension;
+
+public class Nova extends OpenStackClient {
+       
+       private final ExtensionsResource EXTENSIONS;
+       
+       private final ServersResource SERVERS;
+       
+       private final ImagesResource IMAGES;
+       
+       private final FlavorsResource FLAVORS;
+       
+       private final KeyPairsExtension KEY_PAIRS;
+       
+       private final FloatingIpsExtension FLOATING_IPS;
+       
+       private final SecurityGroupsExtension SECURITY_GROUPS;
+       
+       private final SnapshotsExtension SNAPSHOTS;
+       
+       private final VolumesExtension VOLUMES;
+       
+       private final AggregatesExtension AGGREGATES;
+
+       private final QuotaSetsResource QUOTA_SETS;
+       
+       private final HostsExtension HOSTS;
+
+       public Nova(String endpoint, OpenStackClientConnector connector) {
+               super(endpoint, connector);
+               EXTENSIONS = new ExtensionsResource(this);
+               SERVERS = new ServersResource(this);
+               IMAGES = new ImagesResource(this);
+               FLAVORS = new FlavorsResource(this);
+               KEY_PAIRS = new KeyPairsExtension(this);
+               FLOATING_IPS = new FloatingIpsExtension(this);
+               SECURITY_GROUPS = new SecurityGroupsExtension(this);
+               SNAPSHOTS = new SnapshotsExtension(this);
+               VOLUMES = new VolumesExtension(this);
+               AGGREGATES = new AggregatesExtension(this);
+               QUOTA_SETS = new QuotaSetsResource(this);
+               HOSTS = new HostsExtension(this);
+       }
+       
+       public Nova(String endpoint) {
+               this(endpoint, null);
+       }
+       
+       public ExtensionsResource extensions() {
+               return EXTENSIONS;
+       }
+       
+       public ServersResource servers() {
+               return SERVERS;
+       }
+       
+       public ImagesResource images() {
+               return IMAGES;
+       }
+       
+       public FlavorsResource flavors() {
+               return FLAVORS;
+       }
+       
+       public KeyPairsExtension keyPairs() {
+               return KEY_PAIRS;
+       }
+       
+       public FloatingIpsExtension floatingIps() {
+               return FLOATING_IPS;
+       }
+       
+       public SecurityGroupsExtension securityGroups() {
+               return SECURITY_GROUPS;
+       }
+       
+       public SnapshotsExtension snapshots() {
+               return SNAPSHOTS;
+       }
+       
+       public VolumesExtension volumes() {
+               return VOLUMES;
+       }
+
+       public AggregatesExtension aggregates() {
+               return AGGREGATES;
+       }
+
+       public QuotaSetsResource quotaSets() {
+               return QUOTA_SETS;
+       }
+
+       public HostsExtension hosts() {
+               return HOSTS;
+       }
+
+}
diff --git a/nova-client/src/main/java/com/woorea/openstack/nova/api/ExtensionsResource.java b/nova-client/src/main/java/com/woorea/openstack/nova/api/ExtensionsResource.java
new file mode 100644 (file)
index 0000000..46e16c4
--- /dev/null
@@ -0,0 +1,30 @@
+package com.woorea.openstack.nova.api;
+
+
+import com.woorea.openstack.base.client.HttpMethod;
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.nova.model.Extensions;
+
+public class ExtensionsResource {
+       
+       private final OpenStackClient CLIENT;
+       
+       public ExtensionsResource(OpenStackClient client) {
+               CLIENT = client;
+       }
+       
+       public List list(boolean detail) {
+               return new List(detail);
+       }
+       
+       public class List extends OpenStackRequest<Extensions> {
+
+           public List(boolean detail) {
+               super(CLIENT, HttpMethod.GET, detail ? "extensions/detail" : "extensions", null, Extensions.class);
+           }
+           
+        }
+       
+}
+
diff --git a/nova-client/src/main/java/com/woorea/openstack/nova/api/FlavorsResource.java b/nova-client/src/main/java/com/woorea/openstack/nova/api/FlavorsResource.java
new file mode 100644 (file)
index 0000000..c3e2256
--- /dev/null
@@ -0,0 +1,85 @@
+package com.woorea.openstack.nova.api;
+
+
+import com.woorea.openstack.base.client.Entity;
+import com.woorea.openstack.base.client.HttpMethod;
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.nova.model.Flavor;
+import com.woorea.openstack.nova.model.Flavors;
+import com.woorea.openstack.nova.model.Metadata;
+
+public class FlavorsResource {
+       
+       private final OpenStackClient CLIENT;
+       
+       public FlavorsResource(OpenStackClient client) {
+               CLIENT = client;
+       }
+       
+       public List list(boolean detail) {
+               return new List(detail);
+       }
+       
+       public Create create(Flavor flavor) {
+               return new Create(flavor);
+       }
+       
+       public Show show(String id) {
+               return new Show(id);
+       }
+       
+       public ShowMetadata showMetadata(String id) {
+               return new ShowMetadata(id);
+       }
+
+       
+       public Delete delete(String id) {
+               return new Delete(id);
+       }
+
+       public class List extends OpenStackRequest<Flavors> {
+               
+               public List(boolean detail) {
+                       super(CLIENT, HttpMethod.GET, detail ? "/flavors/detail" : "/flavors", null, Flavors.class);
+               }
+
+       }
+       
+       public class Create extends OpenStackRequest<Flavor> {
+
+               private Flavor flavor;
+               
+               public Create(Flavor flavor) {
+                       super(CLIENT, HttpMethod.POST, "/flavors", Entity.json(flavor), Flavor.class);
+                       this.flavor = flavor;
+               }
+               
+       }
+       
+       public class Show extends OpenStackRequest<Flavor> {
+               
+               public Show(String id) {
+                       super(CLIENT, HttpMethod.GET, new StringBuilder("/flavors/").append(id).toString(), null, Flavor.class);
+               }
+
+       }
+       
+       public class ShowMetadata extends OpenStackRequest<Metadata> {
+               
+               public ShowMetadata(String id) {
+                       super(CLIENT, HttpMethod.GET, new StringBuilder("/flavors/").append(id).append("/metadata").toString(), null, Metadata.class);
+               }
+
+       }
+       
+       public class Delete extends OpenStackRequest<Void> {
+               
+               public Delete(String id) {
+                       super(CLIENT, HttpMethod.DELETE, new StringBuilder("/flavors/").append(id).toString(), null, Void.class);
+               }
+               
+       }
+       
+}
+
diff --git a/nova-client/src/main/java/com/woorea/openstack/nova/api/ImagesResource.java b/nova-client/src/main/java/com/woorea/openstack/nova/api/ImagesResource.java
new file mode 100644 (file)
index 0000000..780cb12
--- /dev/null
@@ -0,0 +1,85 @@
+package com.woorea.openstack.nova.api;
+
+
+import com.woorea.openstack.base.client.Entity;
+import com.woorea.openstack.base.client.HttpMethod;
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.nova.model.Image;
+import com.woorea.openstack.nova.model.Images;
+import com.woorea.openstack.nova.model.Metadata;
+
+public class ImagesResource {
+       
+       private final OpenStackClient CLIENT;
+       
+       public ImagesResource(OpenStackClient client) {
+               CLIENT = client;
+       }
+       
+       public List list(boolean detail) {
+               return new List(detail);
+       }
+       
+       public Create create(Image image) {
+               return new Create(image);
+       }
+       
+       public Show show(String id) {
+               return new Show(id);
+       }
+       
+       public ShowMetadata showMetadata(String id) {
+               return new ShowMetadata(id);
+       }
+
+       
+       public Delete delete(String id) {
+               return new Delete(id);
+       }
+
+       public class List extends OpenStackRequest<Images> {
+               
+               public List(boolean detail) {
+                       super(CLIENT, HttpMethod.GET, detail ? "/images/detail" : "/images", null, Images.class);
+               }
+
+       }
+       
+       public class Create extends OpenStackRequest<Image> {
+
+               private Image image;
+               
+               public Create(Image image) {
+                       super(CLIENT, HttpMethod.POST, "/images", Entity.json(image), Image.class);
+                       this.image = image;
+               }
+               
+       }
+       
+       public class Show extends OpenStackRequest<Image> {
+               
+               public Show(String id) {
+                       super(CLIENT, HttpMethod.GET, new StringBuilder("/images/").append(id).toString(), null, Image.class);
+               }
+
+       }
+       
+       public class ShowMetadata extends OpenStackRequest<Metadata> {
+               
+               public ShowMetadata(String id) {
+                       super(CLIENT, HttpMethod.GET, new StringBuilder("/images/").append(id).append("/metadata").toString(), null, Metadata.class);
+               }
+
+       }
+       
+       public class Delete extends OpenStackRequest<Void> {
+               
+               public Delete(String id) {
+                       super(CLIENT, HttpMethod.DELETE, new StringBuilder("/images/").append(id).toString(), null, Void.class);
+               }
+               
+       }
+       
+}
+
diff --git a/nova-client/src/main/java/com/woorea/openstack/nova/api/QuotaSetsResource.java b/nova-client/src/main/java/com/woorea/openstack/nova/api/QuotaSetsResource.java
new file mode 100644 (file)
index 0000000..166fb42
--- /dev/null
@@ -0,0 +1,61 @@
+package com.woorea.openstack.nova.api;
+
+
+import com.woorea.openstack.base.client.Entity;
+import com.woorea.openstack.base.client.HttpMethod;
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.nova.model.Limits;
+import com.woorea.openstack.nova.model.QuotaSet;
+import com.woorea.openstack.nova.model.SimpleTenantUsage;
+
+public class QuotaSetsResource {
+       
+       private final OpenStackClient CLIENT;
+       
+       public QuotaSetsResource(OpenStackClient client) {
+               CLIENT = client;
+       }
+       
+       public ShowQuota showQuota(String tenantId) {
+               return new ShowQuota(tenantId);
+       }
+
+       public UpdateQuota updateQuota(String tenantId, QuotaSet quotaSet) {
+               return new UpdateQuota(tenantId, quotaSet);
+       }
+
+       public ShowUsage showUsage(String tenantId) {
+               return new ShowUsage(tenantId);
+       }
+
+       public ShowUsedLimits showUsedLimits() {
+               return new ShowUsedLimits();
+       }
+
+       public class ShowQuota extends OpenStackRequest<QuotaSet> {
+           public ShowQuota(String tenantId) {
+               super(CLIENT, HttpMethod.GET, new StringBuilder("/os-quota-sets/").append(tenantId), null, QuotaSet.class);
+           }
+           
+       }
+
+       public class UpdateQuota extends OpenStackRequest<QuotaSet> {
+               public UpdateQuota(String tenantId, QuotaSet quotaSet) {
+                       super(CLIENT, HttpMethod.PUT, new StringBuilder("/os-quota-sets/").append(tenantId), Entity.json(quotaSet), QuotaSet.class);
+               }
+       }
+
+       public class ShowUsage extends OpenStackRequest<SimpleTenantUsage> {
+               public ShowUsage(String tenantId) {
+                       super(CLIENT, HttpMethod.GET, new StringBuilder("/os-simple-tenant-usage/").append(tenantId), null, SimpleTenantUsage.class);
+               }
+       }
+
+       public class ShowUsedLimits extends OpenStackRequest<Limits> {
+               public ShowUsedLimits() {
+                       super(CLIENT, HttpMethod.GET, new StringBuilder("/limits"), null, Limits.class);
+               }
+       }
+}
+
diff --git a/nova-client/src/main/java/com/woorea/openstack/nova/api/ServersResource.java b/nova-client/src/main/java/com/woorea/openstack/nova/api/ServersResource.java
new file mode 100644 (file)
index 0000000..ca48b6f
--- /dev/null
@@ -0,0 +1,541 @@
+package com.woorea.openstack.nova.api;
+
+
+import java.util.Map;
+
+import com.woorea.openstack.base.client.Entity;
+import com.woorea.openstack.base.client.HttpMethod;
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.nova.model.Metadata;
+import com.woorea.openstack.nova.model.Server;
+import com.woorea.openstack.nova.model.Server.Addresses;
+import com.woorea.openstack.nova.model.ServerAction.ChangePassword;
+import com.woorea.openstack.nova.model.ServerAction.ConfirmResize;
+import com.woorea.openstack.nova.model.ServerAction.ConsoleOutput;
+import com.woorea.openstack.nova.model.ServerAction.CreateBackup;
+import com.woorea.openstack.nova.model.ServerAction.CreateImage;
+import com.woorea.openstack.nova.model.ServerAction.GetConsoleOutput;
+import com.woorea.openstack.nova.model.ServerAction.GetVncConsole;
+import com.woorea.openstack.nova.model.ServerAction.Lock;
+import com.woorea.openstack.nova.model.ServerAction.Pause;
+import com.woorea.openstack.nova.model.ServerAction.Reboot;
+import com.woorea.openstack.nova.model.ServerAction.Rebuild;
+import com.woorea.openstack.nova.model.ServerAction.Rescue;
+import com.woorea.openstack.nova.model.ServerAction.Resize;
+import com.woorea.openstack.nova.model.ServerAction.Resume;
+import com.woorea.openstack.nova.model.ServerAction.RevertResize;
+import com.woorea.openstack.nova.model.ServerAction.Start;
+import com.woorea.openstack.nova.model.ServerAction.Stop;
+import com.woorea.openstack.nova.model.ServerAction.Suspend;
+import com.woorea.openstack.nova.model.ServerAction.Unlock;
+import com.woorea.openstack.nova.model.ServerAction.Unpause;
+import com.woorea.openstack.nova.model.ServerAction.Unrescue;
+import com.woorea.openstack.nova.model.ServerAction.VncConsole;
+import com.woorea.openstack.nova.model.ServerForCreate;
+import com.woorea.openstack.nova.model.Servers;
+import com.woorea.openstack.nova.model.VolumeAttachment;
+import com.woorea.openstack.nova.model.VolumeAttachments;
+
+public class ServersResource {
+
+       private final OpenStackClient CLIENT;
+
+       public ServersResource(OpenStackClient client) {
+               CLIENT = client;
+       }
+
+       public List list(boolean detail) {
+               return new List(detail);
+       }
+
+       public Boot boot(ServerForCreate server) {
+               return new Boot(server);
+       }
+
+       public Show show(String id) {
+               return new Show(id);
+       }
+
+       public ShowMetadata showMetadata(String id) {
+               return new ShowMetadata(id);
+       }
+       
+       public CreateOrUpdateMetadata createOrUpdateMetadata(String id,Metadata metadata) {
+               return new CreateOrUpdateMetadata(id,metadata);
+       }
+       
+       public ReplaceMetadata replaceMetadata(String id,Metadata metadata) {
+               return new ReplaceMetadata(id,metadata);
+       }
+       public DeleteMetadata deleteMetadata(String id, String key) {
+               return new DeleteMetadata(id,key);
+       }
+
+       public Delete delete(String id) {
+               return new Delete(id);
+       }
+
+       public class List extends OpenStackRequest<Servers> {
+
+               public List(boolean detail) {
+                       super(CLIENT, HttpMethod.GET, detail ? "/servers/detail" : "/servers", null, Servers.class);
+               }
+
+       }
+
+       public class Boot extends OpenStackRequest<Server> {
+
+               private ServerForCreate server;
+
+               public Boot(ServerForCreate server) {
+                       super(CLIENT, HttpMethod.POST, "/servers", Entity.json(server), Server.class);
+                       this.server = server;
+               }
+
+       }
+
+       public class Show extends OpenStackRequest<Server> {
+
+               public Show(String id) {
+                       super(CLIENT, HttpMethod.GET, new StringBuilder("/servers/").append(id), null, Server.class);
+               }
+
+       }
+
+       public class ShowMetadata extends OpenStackRequest<Metadata> {
+
+               public ShowMetadata(String id) {
+                       super(CLIENT, HttpMethod.GET, new StringBuilder("/servers/").append(id).append("/metadata"), null, Metadata.class);
+               }
+
+       }
+       
+       public class CreateOrUpdateMetadata extends OpenStackRequest<Metadata> {
+
+               public CreateOrUpdateMetadata(String id,Metadata metadata) {
+                       super(CLIENT, HttpMethod.POST, new StringBuilder("/servers/").append(id).append("/metadata"), Entity.json(metadata), Metadata.class);
+               }
+
+       }
+       public class ReplaceMetadata extends OpenStackRequest<Metadata> {
+
+               public ReplaceMetadata(String id,Metadata metadata) {
+                       super(CLIENT, HttpMethod.PUT, new StringBuilder("/servers/").append(id).append("/metadata"), Entity.json(metadata), Metadata.class);
+               }
+
+       }
+       
+       public class DeleteMetadata extends OpenStackRequest<Void> {
+
+               public DeleteMetadata(String id,String key) {
+                       super(CLIENT, HttpMethod.DELETE, new StringBuilder("/servers/").append(id).append("/metadata/").append(key), null, Void.class);
+               }
+
+       }
+       
+       
+       public class Delete extends OpenStackRequest<Void> {
+
+               public Delete(String id) {
+                       super(CLIENT, HttpMethod.DELETE, new StringBuilder("/servers/").append(id), null, Void.class);
+               }
+
+       }
+
+       public class ShowServerAddresses extends OpenStackRequest<Addresses> {
+
+               public ShowServerAddresses(String id) {
+                       super(CLIENT, HttpMethod.GET, new StringBuilder("/servers/").append(id).append("/ips"), null, Addresses.class);
+               }
+
+       }
+
+       public class UpdateServer extends OpenStackRequest<Server> {
+
+               private Server server;
+
+               public UpdateServer(String id, Server server) {
+                       super(CLIENT, HttpMethod.PUT, new StringBuilder("/servers/").append(id), Entity.json(server), Server.class);
+                       this.server = server;
+               }
+
+       }
+       
+       public UpdateServer update(String serverId, String name, String accessIPv4, String accessIPv6) {
+           Server server = new Server();
+           //server.setName(name);
+           //server.setAccessIPv4(accessIPv4);
+           //server.setAccessIPv6(accessIPv6);
+           return new UpdateServer(serverId, server);
+         }
+
+       public abstract class Action<T> extends OpenStackRequest<T> {
+
+               public Action(String id, Entity<?> entity, Class<T> returnType) {
+                       super(CLIENT, HttpMethod.POST, new StringBuilder("/servers/").append(id).append("/action"), entity, returnType);
+               }
+
+       }
+
+       public class ChangePasswordAction extends Action<Server> {
+
+               private ChangePassword action;
+
+               public ChangePasswordAction(String id, ChangePassword action) {
+                       super(id, Entity.json(action), Server.class);
+               }
+
+       }
+       
+       public ChangePasswordAction changePassword(String serverId, String adminPass) {
+           ChangePassword changePassword = new ChangePassword();
+           changePassword.setAdminPass(adminPass);
+           return new ChangePasswordAction(serverId, changePassword);
+         }
+
+       public class RebootAction extends Action<Void> {
+
+               private Reboot action;
+
+               public RebootAction(String id, Reboot action) {
+                       super(id, Entity.json(action), Void.class);
+               }
+
+       }
+
+       public RebootAction reboot(String serverId, String rebootType) {  
+               Reboot reboot = new Reboot();
+               reboot.setType(rebootType);
+               return new RebootAction(serverId, reboot);
+       }
+
+       public class RebuildAction extends Action<Server> {
+
+               private Rebuild action;
+
+               public RebuildAction(String id, Rebuild action) {
+                       super(id, Entity.json(action), Server.class);
+               }
+
+       }
+       
+       public RebuildAction rebuild(String serverId, Rebuild rebuild) {
+               return new RebuildAction(serverId, rebuild);
+       }
+
+       public class ResizeAction extends Action<Server> {
+
+               private Resize action;
+
+               public ResizeAction(String id, Resize action) {
+                       super(id, Entity.json(action), Server.class);
+               }
+
+       }
+       
+        public ResizeAction resize(String serverId, String flavorId, String diskConfig) {
+           Resize resize = new Resize();
+           resize.setFlavorRef(flavorId);
+           resize.setDiskConfig(diskConfig);
+           return new ResizeAction(serverId, resize);
+         }
+
+       public class ConfirmResizeAction extends Action<Server> {
+
+               public ConfirmResizeAction(String id) {
+                       super(id, Entity.json(new ConfirmResize()), Server.class);
+               }
+
+       }
+       
+       public ConfirmResizeAction confirmResize(String serverId) {
+           return new ConfirmResizeAction(serverId);
+         }
+
+       public class RevertResizeAction extends Action<Server> {
+
+               public RevertResizeAction(String id) {
+                       super(id, Entity.json(new RevertResize()), Server.class);
+               }
+
+       }
+       
+       public RevertResizeAction revertResize(String serverId) {
+           return new RevertResizeAction(serverId);
+         }
+
+    public class CreateImageAction extends Action<Void> {
+
+        public CreateImageAction(String id, CreateImage createImage) {
+            super(id, Entity.json(createImage), Void.class);
+        }
+
+    }
+    
+    public CreateImageAction createImage(String serverId, String name, Map<String, String> metadata) {
+       CreateImage createImage = new CreateImage();
+       createImage.setName(name);
+       createImage.setMetadata(metadata);
+        return new CreateImageAction(serverId, createImage);
+      }
+
+       public class StartServer extends OpenStackRequest<Void> {
+
+               private Start action;
+
+               private String id;
+
+               public StartServer(String id) {
+                       super(CLIENT, HttpMethod.POST, new StringBuilder("/servers/").append(id).append("/action"), Entity.json(new Start()), Void.class);
+               }
+
+       }
+
+       public class StopServer extends OpenStackRequest<Void> {
+
+               private Stop action;
+
+               private String id;
+
+               public StopServer(String id) {
+                       super(CLIENT, HttpMethod.POST, new StringBuilder("/servers/").append(id).append("/action"), Entity.json(new Stop()), Void.class);
+               }
+
+       }
+       
+       public StartServer start(String id) {
+           return new StartServer(id);
+         }
+       
+         public StopServer stop(String id) {
+           return new StopServer(id);
+         }
+
+       public class GetVncConsoleServer extends OpenStackRequest<VncConsole> {
+
+               private GetVncConsole action;
+
+               private String id;
+
+               public GetVncConsoleServer(String id, GetVncConsole action) {
+                       super(CLIENT, HttpMethod.POST, new StringBuilder("/servers/").append(id).append("/action"), Entity.json(action), VncConsole.class);
+               }
+
+       }
+
+       public GetVncConsoleServer getVncConsole(String id, String type) {
+               GetVncConsole action = new GetVncConsole(type);
+               return new GetVncConsoleServer(id, action);
+       }
+
+       public class GetConsoleOutputServer extends OpenStackRequest<ConsoleOutput> {
+
+               public GetConsoleOutputServer(String id, GetConsoleOutput action) {
+                       super(CLIENT, HttpMethod.POST, new StringBuilder("/servers/").append(id).append("/action"), Entity.json(action), ConsoleOutput.class);
+               }
+
+       }
+
+       public GetConsoleOutputServer getConsoleOutput(String id, int length) {
+               GetConsoleOutput action = new GetConsoleOutput(length);
+               return new GetConsoleOutputServer(id, action);
+       }
+
+       public class PauseServer extends OpenStackRequest<Void> {
+
+               public PauseServer(String id) {
+                       super(CLIENT, HttpMethod.POST, new StringBuilder("/servers/").append(id).append("/action"), Entity.json(new Pause()), Void.class);
+               }
+
+       }
+
+       public class UnpauseServer extends OpenStackRequest<Void> {
+
+               public UnpauseServer(String id) {
+                       super(CLIENT, HttpMethod.POST, new StringBuilder("/servers/").append(id).append("/action"), Entity.json(new Unpause()), Void.class);
+               }
+
+
+       }
+
+       public class LockServer extends OpenStackRequest<Void> {
+
+               private Lock action;
+
+               private String id;
+
+               public LockServer(String id) {
+                       super(CLIENT, HttpMethod.POST, new StringBuilder("/servers/").append(id).append("/action"), Entity.json(new Lock()), Void.class);
+               }
+
+       }
+
+       public class UnlockServer extends OpenStackRequest<Void> {
+
+               private Unlock action;
+
+               private String id;
+
+               public UnlockServer(String id) {
+                       super(CLIENT, HttpMethod.POST, new StringBuilder("/servers/").append(id).append("/action"), Entity.json(new Unlock()), Void.class);
+               }
+
+       }
+
+       public class SuspendServer extends OpenStackRequest<Void> {
+
+               public SuspendServer(String id) {
+                       super(CLIENT, HttpMethod.POST, new StringBuilder("/servers/").append(id).append("/action"), Entity.json(new Suspend()), Void.class);
+               }
+
+       }
+
+       public class ResumeServer extends OpenStackRequest<Void> {
+
+               public ResumeServer(String id) {
+                       super(CLIENT, HttpMethod.POST, new StringBuilder("/servers/").append(id).append("/action"), Entity.json(new Resume()), Void.class);
+               }
+
+       }
+
+       public class CreateBackupServer extends OpenStackRequest<Void> {
+
+               public CreateBackupServer(String id, CreateBackup action) {
+                       super(CLIENT, HttpMethod.POST, new StringBuilder("/servers/").append(id).append("/action"), Entity.json(action), Void.class);
+               }
+
+       }
+
+       public PauseServer pause(String serverId) {
+               return new PauseServer(serverId);
+       }
+
+       public UnpauseServer unpause(String serverId) {
+               return new UnpauseServer(serverId);
+       }
+
+       public LockServer lock(String serverId) {
+               return new LockServer(serverId);
+       }
+
+       public UnlockServer unlock(String serverId) {
+               return new UnlockServer(serverId);
+       }
+
+       public SuspendServer suspend(String serverId) {
+               return new SuspendServer(serverId);
+       }
+
+       public ResumeServer resume(String serverId) {
+               return new ResumeServer(serverId);
+       }
+
+       public CreateBackupServer createBackup(String serverId, CreateBackup action) {
+               return new CreateBackupServer(serverId, action);
+       }
+
+       public class RescueServer extends OpenStackRequest<Void> {
+
+               public RescueServer(String id, Rescue action) {
+                       super(CLIENT, HttpMethod.POST, new StringBuilder("/servers/").append(id).append("/action"), Entity.json(action), Void.class);
+               }
+
+       }
+
+       public class UnrescueServer extends OpenStackRequest<Void> {
+
+               public UnrescueServer(String id) {
+                       super(CLIENT, HttpMethod.POST, new StringBuilder("/servers/").append(id).append("/action"), Entity.json(new Unrescue()), Void.class);
+               }
+
+       }
+
+       public RescueServer rescue(String serverId, String adminPass) {
+               Rescue action = new Rescue(adminPass);
+               return new RescueServer(serverId, action);
+       }
+
+       public UnrescueServer unrescue(String serverId) {
+               return new UnrescueServer(serverId);
+       }
+
+       public class AssociateFloatingIp extends OpenStackRequest<Void> {
+
+               public AssociateFloatingIp(String id, com.woorea.openstack.nova.model.ServerAction.AssociateFloatingIp action) {
+                       super(CLIENT, HttpMethod.POST, new StringBuilder("/servers/").append(id).append("/action"), Entity.json(action), Void.class);
+               }
+
+       }
+
+       public class DisassociateFloatingIp extends OpenStackRequest<Void> {
+
+               public DisassociateFloatingIp(String id, com.woorea.openstack.nova.model.ServerAction.DisassociateFloatingIp action) {
+                       super(CLIENT, HttpMethod.POST, new StringBuilder("/servers/").append(id).append("/action"), Entity.json(action), Void.class);
+               }
+
+       }
+
+       public AssociateFloatingIp associateFloatingIp(String serverId, String floatingIpAddress) {
+               com.woorea.openstack.nova.model.ServerAction.AssociateFloatingIp action = new com.woorea.openstack.nova.model.ServerAction.AssociateFloatingIp(floatingIpAddress);
+               return new AssociateFloatingIp(serverId, action);
+       }
+
+       public DisassociateFloatingIp disassociateFloatingIp(String serverId, String floatingIpAddress) {
+               com.woorea.openstack.nova.model.ServerAction.DisassociateFloatingIp action = new com.woorea.openstack.nova.model.ServerAction.DisassociateFloatingIp(floatingIpAddress);
+               return new DisassociateFloatingIp(serverId, action);
+       }
+
+       public  class AttachVolume extends OpenStackRequest<Void> {
+
+               public AttachVolume(String serverId, final VolumeAttachment volumeAttachment) {
+                       super(CLIENT, HttpMethod.POST, new StringBuilder("/servers/").append(serverId).append("/os-volume_attachments"), Entity.json(volumeAttachment), Void.class);
+               }
+
+       }
+
+       public class DetachVolume extends OpenStackRequest<Void> {
+
+               public DetachVolume(String serverId, String volumeId) {
+                       super(CLIENT, HttpMethod.DELETE, new StringBuilder("/servers/").append(serverId).append("/os-volume_attachments/").append(volumeId), null, Void.class);
+               }
+
+       }
+
+       public  class ListVolumeAttachments extends OpenStackRequest<VolumeAttachments> {
+
+               public ListVolumeAttachments(String serverId) {
+                       super(CLIENT, HttpMethod.GET, new StringBuilder("/servers/").append(serverId).append("/os-volume_attachments"), null, VolumeAttachments.class);
+               }
+
+       }
+
+       public  class ShowVolumeAttachment extends OpenStackRequest<VolumeAttachment> {
+
+               public ShowVolumeAttachment(String serverId, String volumeAttachmentId) {
+                       super(CLIENT, HttpMethod.GET, new StringBuilder("/servers/").append(serverId).append("/os-volume_attachments/").append(volumeAttachmentId), null, VolumeAttachment.class);
+               }
+
+       }
+
+       public AttachVolume attachVolume(String serverId, String volumeId, String device) {
+               VolumeAttachment volumeAttachment = new VolumeAttachment();
+               volumeAttachment.setVolumeId(volumeId);
+               volumeAttachment.setDevice(device);
+               return new AttachVolume(serverId, volumeAttachment);
+       }
+
+       public DetachVolume detachVolume(String serverId, String volumeId) {
+               return new DetachVolume(serverId, volumeId);
+       }
+
+       public ListVolumeAttachments listVolumeAttachments(String serverId) {
+               return new ListVolumeAttachments(serverId);
+       }
+
+       public ShowVolumeAttachment showVolumeAttachment(String serverId, String volumeAttachmentId) {
+               return new ShowVolumeAttachment(serverId, volumeAttachmentId);
+       }
+
+}
+
diff --git a/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/AggregatesExtension.java b/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/AggregatesExtension.java
new file mode 100644 (file)
index 0000000..fa757af
--- /dev/null
@@ -0,0 +1,163 @@
+package com.woorea.openstack.nova.api.extensions;
+
+import java.util.Map;
+
+
+import com.woorea.openstack.base.client.Entity;
+import com.woorea.openstack.base.client.HttpMethod;
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.nova.model.HostAggregate;
+import com.woorea.openstack.nova.model.HostAggregates;
+
+public class AggregatesExtension {
+       
+       private final OpenStackClient CLIENT;
+       
+       public AggregatesExtension(OpenStackClient client) {
+               CLIENT = client;
+       }
+       
+       public List list() {
+               return new List();
+       }
+
+       public ShowAggregate showAggregate(String id) {
+               return new ShowAggregate(id);
+       }
+
+       public UpdateAggregateMetadata updateAggregateMetadata(String id,
+                       String name, String availabilityZone) {
+               return new UpdateAggregateMetadata(id, name, availabilityZone);
+       }
+
+       public CreateAggregate createAggregate(String aggregateName,
+                                                                                  String availabilityZoneName) {
+               return new CreateAggregate(aggregateName, availabilityZoneName);
+       }
+
+       public DeleteAggregate deleteAggregate(String id) {
+               return new DeleteAggregate(id);
+       }
+
+       public AddHost addHost(String aggregateId, String hostId) {
+               return new AddHost(aggregateId, hostId);
+       }
+
+       public RemoveHost removeHost(String aggregateId, String hostId) {
+               return new RemoveHost(hostId, aggregateId);
+       }
+
+       public SetMetadata setMetadata(String aggregateId,
+                                                                  String key, String value) {
+               return new SetMetadata(aggregateId, key, value);
+       }
+
+       public class List extends OpenStackRequest<HostAggregates> {
+               
+               public List() {
+                       super(CLIENT, HttpMethod.GET, "/os-aggregates",
+                                 null,
+                                 HostAggregates.class);
+               }
+
+       }
+
+       public class ShowAggregate extends OpenStackRequest<HostAggregate> {
+
+               public ShowAggregate(String id) {
+                       super(CLIENT, HttpMethod.GET,
+                                 new StringBuffer("/os-aggregates/").append(id),
+                                 null,
+                                 HostAggregate.class);
+               }
+
+       }
+
+       public class UpdateAggregateMetadata extends OpenStackRequest<HostAggregate> {
+               public UpdateAggregateMetadata(String id,
+                                                                          String name, String availabilityZone) {
+                       super(CLIENT, HttpMethod.PUT,
+                                 new StringBuffer("/os-aggregates/").append(id),
+                                 availabilityZone == null ?
+                                 Entity.json("{\"aggregate\": {\"name\": \"" + name + "\" }}")
+                                 :
+                                 Entity.json("{\"aggregate\": {\"name\": \"" +
+                                                         name +
+                                                         "\", \"availability_zone\": \"" +
+                                                         availabilityZone +
+                                                         "\" }}"),
+                                 HostAggregate.class);
+               }
+
+       }
+
+       public class CreateAggregate extends OpenStackRequest<HostAggregate> {
+
+               public CreateAggregate(String name, String availabilityZone) {
+                       super(CLIENT, HttpMethod.POST,
+                                 new StringBuffer("/os-aggregates"),
+                                 availabilityZone == null ?
+                                 Entity.json("{\"aggregate\": {\"name\": \"" +
+                                                         name +
+                                                         "\", \"availability_zone\": null }}")
+                                 :
+                                 Entity.json("{\"aggregate\": {\"name\": \"" +
+                                                         name +
+                                                         "\", \"availability_zone\": \"" +
+                                                         availabilityZone +
+                                                         "\" }}"),
+                                 HostAggregate.class);
+               }
+
+       }
+
+       public class DeleteAggregate extends OpenStackRequest<Void> {
+
+               public DeleteAggregate(String id) {
+                       super(CLIENT, HttpMethod.DELETE,
+                                 new StringBuffer("/os-aggregates/").append(id),
+                                 null,
+                                 null);
+               }
+       }
+
+       public class AddHost extends OpenStackRequest<HostAggregate> {
+
+               public AddHost(String aggregateId, String hostId) {
+                       super(CLIENT, HttpMethod.POST,
+                                 new StringBuffer("/os-aggregates/")
+                                 .append(aggregateId).append("/action"),
+                                 Entity.json("{\"add_host\": {\"host\": \"" +
+                                                         hostId + "\" }}"),
+                                 HostAggregate.class);
+               }
+
+       }
+
+       public class RemoveHost extends OpenStackRequest<HostAggregate> {
+
+               public RemoveHost(String hostId, String aggregateId) {
+                       super(CLIENT, HttpMethod.POST,
+                                 new StringBuffer("/os-aggregates/")
+                                 .append(aggregateId).append("/action"),
+                                 Entity.json("{\"remove_host\": {\"host\": \"" +
+                                                         hostId + "\" }}"),
+                                 HostAggregate.class);
+               }
+
+       }
+
+       public class SetMetadata extends OpenStackRequest<HostAggregate> {
+
+               public SetMetadata(String aggregateId, String key, String value) {
+                       super(CLIENT, HttpMethod.POST,
+                                 new StringBuffer("/os-aggregates/")
+                                 .append(aggregateId).append("/action"),
+                                 Entity.json("{\"set_metadata\": {\"metadata\": { \"" +
+                                                         key + "\": \"" + value + "\" }}}"),
+                                 HostAggregate.class);
+               }
+       }
+}
+
diff --git a/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/CloudpipesExtension.java b/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/CloudpipesExtension.java
new file mode 100644 (file)
index 0000000..90450c8
--- /dev/null
@@ -0,0 +1,49 @@
+package com.woorea.openstack.nova.api.extensions;
+
+
+import com.woorea.openstack.base.client.Entity;
+import com.woorea.openstack.base.client.HttpMethod;
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.nova.model.Cloudpipe;
+import com.woorea.openstack.nova.model.Cloudpipes;
+
+public class CloudpipesExtension {
+       
+       private final OpenStackClient CLIENT;
+       
+       public CloudpipesExtension(OpenStackClient client) {
+               CLIENT = client;
+       }
+       
+       public List list() {
+               return new List();
+       }
+       
+       public Create create(Cloudpipe cloudpipe) {
+               return new Create(cloudpipe);
+       }
+       
+       public class List extends OpenStackRequest<Cloudpipes> {
+
+               
+               public List() {
+                       super(CLIENT, HttpMethod.GET, "/os-cloudpipes", null, Cloudpipes.class);
+               }
+
+       }
+
+       public class Create extends OpenStackRequest<Cloudpipe> {
+
+               private Cloudpipe cloudpipe;
+               
+               public Create(Cloudpipe cloudpipe) {
+                       super(CLIENT, HttpMethod.POST, "/os-cloudpipes", Entity.json(cloudpipe), Cloudpipe.class);
+                       this.cloudpipe = cloudpipe;
+               }
+
+       }
+
+       
+       
+}
diff --git a/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/CredentialsExtension.java b/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/CredentialsExtension.java
new file mode 100644 (file)
index 0000000..b689fd6
--- /dev/null
@@ -0,0 +1,43 @@
+package com.woorea.openstack.nova.api.extensions;
+
+
+import com.woorea.openstack.base.client.HttpMethod;
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.nova.model.Certificate;
+
+public class CredentialsExtension {
+       
+       private final OpenStackClient CLIENT;
+       
+       public CredentialsExtension(OpenStackClient client) {
+               CLIENT = client;
+       }
+       
+       public Create createCertificate(String id) {
+               return new Create(id);
+       }
+
+       public Show showCertificate(String id) {
+               return new Show();
+       }
+
+       public class Create extends OpenStackRequest<Certificate> {
+
+               public Create(String id) {
+                       super(CLIENT, HttpMethod.GET, new StringBuffer("/os-certificates").append(id).toString(), null, Certificate.class);
+               }
+
+       }
+
+       public class Show extends OpenStackRequest<Certificate> {
+
+               public Show() {
+                       super(CLIENT, HttpMethod.GET, "/os-certificates", null, Certificate.class);
+               }
+
+       }
+
+       
+
+}
diff --git a/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/FloatingIpDnsExtension.java b/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/FloatingIpDnsExtension.java
new file mode 100644 (file)
index 0000000..e2a399a
--- /dev/null
@@ -0,0 +1,89 @@
+package com.woorea.openstack.nova.api.extensions;
+
+
+import com.woorea.openstack.base.client.Entity;
+import com.woorea.openstack.base.client.HttpMethod;
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.nova.model.FloatingIpDomain;
+import com.woorea.openstack.nova.model.FloatingIpDomains;
+
+public class FloatingIpDnsExtension {
+       
+       private final OpenStackClient CLIENT;
+       
+       public FloatingIpDnsExtension(OpenStackClient client) {
+               CLIENT = client;
+       }
+       
+       public ListDomains listFloatingIpDomains() {
+               return new ListDomains();
+       }
+       
+       public CreateDomain create(FloatingIpDomain floatingIpDomain) {
+               return new CreateDomain(floatingIpDomain);
+       }
+       
+       public ShowDomain show(String id) {
+               return new ShowDomain(id);
+       }
+       
+       public UpdateDomain update(FloatingIpDomain floatingIpDomain) {
+               return new UpdateDomain(floatingIpDomain);
+       }
+       
+       public DeleteDomain delete(String id) {
+               return new DeleteDomain(id);
+       }
+       
+       public class ListDomains extends OpenStackRequest<FloatingIpDomains> {
+
+               public ListDomains() {
+                       super(CLIENT, HttpMethod.GET, "/os-floating-ip-dns", null, FloatingIpDomains.class);
+               }
+
+       }
+
+       public class CreateDomain extends OpenStackRequest<FloatingIpDomain> {
+
+               private FloatingIpDomain floatingIpDomain;
+               
+               public CreateDomain(FloatingIpDomain floatingIpDomain) {
+                       super(CLIENT, HttpMethod.POST, "/os-floating-ip-dns", Entity.json(floatingIpDomain), FloatingIpDomain.class);
+                       this.floatingIpDomain = floatingIpDomain;
+               }
+               
+       }
+       
+       public class ShowDomain extends OpenStackRequest<FloatingIpDomain> {
+               
+               public ShowDomain(String id) {
+                       super(CLIENT, HttpMethod.GET, new StringBuffer("/os-floating-ip-dns/").append(id).toString(), null, FloatingIpDomain.class);
+               }
+               
+       }
+
+       
+       public static class UpdateDomain extends OpenStackRequest<FloatingIpDomain> {
+
+               private FloatingIpDomain floatingIpDomain;
+               
+               public UpdateDomain(FloatingIpDomain floatingIpDomain) {
+                       //super(CLIENT, HttpMethod.PUT, new StringBuffer("/os-floating-ip-dns/").append(id).toString(), Entity.json(floatingIpDomain), FloatingIpDomain.class);
+                       this.floatingIpDomain = floatingIpDomain;
+               }
+               
+       }
+
+       
+       public class DeleteDomain extends OpenStackRequest<Void> {
+               
+               public DeleteDomain(String id) {
+                       super(CLIENT, HttpMethod.DELETE, new StringBuffer("/os-floating-ip-dns/").append(id).toString(), null, Void.class);
+               }
+               
+       }
+       
+       
+       
+}
diff --git a/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/FloatingIpPoolsExtension.java b/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/FloatingIpPoolsExtension.java
new file mode 100644 (file)
index 0000000..cfcba23
--- /dev/null
@@ -0,0 +1,31 @@
+package com.woorea.openstack.nova.api.extensions;
+
+
+import com.woorea.openstack.base.client.HttpMethod;
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.nova.model.FloatingIpPools;
+
+public class FloatingIpPoolsExtension {
+       
+       private final OpenStackClient CLIENT;
+       
+       public FloatingIpPoolsExtension(OpenStackClient client) {
+               CLIENT = client;
+       }
+       
+       public List list() {
+               return new List();
+       }
+
+       public class List extends OpenStackRequest<FloatingIpPools> {
+
+               public List() {
+                       super(CLIENT, HttpMethod.GET, "/os-floating-ip-pools", null, FloatingIpPools.class);
+               }
+
+       }
+
+       
+
+}
diff --git a/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/FloatingIpsExtension.java b/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/FloatingIpsExtension.java
new file mode 100644 (file)
index 0000000..0923b7e
--- /dev/null
@@ -0,0 +1,67 @@
+package com.woorea.openstack.nova.api.extensions;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+import com.woorea.openstack.base.client.Entity;
+import com.woorea.openstack.base.client.HttpMethod;
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.nova.model.FloatingIp;
+import com.woorea.openstack.nova.model.FloatingIps;
+
+public class FloatingIpsExtension {
+       
+       private final OpenStackClient CLIENT;
+       
+       public FloatingIpsExtension(OpenStackClient client) {
+               CLIENT = client;
+       }
+       
+       public class List extends OpenStackRequest<FloatingIps> {
+
+               public List() {
+                       super(CLIENT, HttpMethod.GET, "/os-floating-ips", null, FloatingIps.class);
+               }
+
+       }
+
+       public class Allocate extends OpenStackRequest<FloatingIp> {
+               
+               public Allocate(Entity<?> entity) {
+                       super(CLIENT, HttpMethod.POST, "/os-floating-ips", entity, FloatingIp.class);
+               }
+
+       }
+       
+       public class Deallocate extends OpenStackRequest<Void> {
+               
+               public Deallocate(String id) {
+                       super(CLIENT, HttpMethod.DELETE, new StringBuffer("/os-floating-ips/").append(id).toString(), null, Void.class);
+               }
+               
+       }
+
+       public List list() {
+               return new List();
+       }
+       
+       public Allocate allocate(String pool) {
+               Entity<?> entity=null;
+               if(pool!=null) {
+                       Map<String, String> body = new HashMap<String, String>();
+                       body.put("pool", pool);
+                       entity=Entity.json(body);
+               }
+               return new Allocate(entity);
+       }
+       
+       public Deallocate deallocate(String id) {
+               return new Deallocate(id);
+       }
+       
+       
+       
+}
+
diff --git a/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/HostsExtension.java b/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/HostsExtension.java
new file mode 100644 (file)
index 0000000..9a4814d
--- /dev/null
@@ -0,0 +1,44 @@
+package com.woorea.openstack.nova.api.extensions;
+
+
+import com.woorea.openstack.base.client.HttpMethod;
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.nova.model.Host;
+import com.woorea.openstack.nova.model.Hosts;
+
+public class HostsExtension {
+       
+       private final OpenStackClient CLIENT;
+       
+       public HostsExtension(OpenStackClient client) {
+               CLIENT = client;
+       }
+       
+       public List list() {
+               return new List();
+       }
+       
+       public Show show(String id) {
+               return new Show(id);
+       }
+
+       public class List extends OpenStackRequest<Hosts> {
+
+               public List() {
+                       super(CLIENT, HttpMethod.GET, "/os-hosts", null, Hosts.class);
+               }
+
+       }
+
+       public class Show extends OpenStackRequest<Host> {
+               
+               public Show(String id) {
+                       super(CLIENT, HttpMethod.GET, new StringBuffer("/os-hosts/").append(id).toString(), null, Host.class);
+               }
+               
+       }
+
+       
+       
+}
diff --git a/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/HypervisorsExtension.java b/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/HypervisorsExtension.java
new file mode 100644 (file)
index 0000000..ed1ad10
--- /dev/null
@@ -0,0 +1,5 @@
+package com.woorea.openstack.nova.api.extensions;
+
+public class HypervisorsExtension {
+
+}
diff --git a/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/KeyPairsExtension.java b/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/KeyPairsExtension.java
new file mode 100644 (file)
index 0000000..5e2c555
--- /dev/null
@@ -0,0 +1,65 @@
+package com.woorea.openstack.nova.api.extensions;
+
+
+import com.woorea.openstack.base.client.Entity;
+import com.woorea.openstack.base.client.HttpMethod;
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.nova.model.KeyPair;
+import com.woorea.openstack.nova.model.KeyPairs;
+
+public class KeyPairsExtension {
+       
+       private final OpenStackClient CLIENT;
+       
+       public KeyPairsExtension(OpenStackClient client) {
+               CLIENT = client;
+       }
+       
+       public List list() {
+               return new List();
+       }
+
+       public Create create(String name, String publicKey) {
+               KeyPair keyPairForCreate = new KeyPair(name, publicKey);
+               return new Create(keyPairForCreate);
+       }
+
+       public Create create(String name) {
+               return create(name, null);
+       }
+
+       public Delete delete(String name) {
+               return new Delete(name);
+       }
+
+       public class Create extends OpenStackRequest<KeyPair> {
+
+               private KeyPair keyPairForCreate;
+
+               public Create(KeyPair keyPairForCreate) {
+                       super(CLIENT, HttpMethod.POST, "/os-keypairs", Entity.json(keyPairForCreate), KeyPair.class);
+                       this.keyPairForCreate = keyPairForCreate;
+               }
+
+       }
+
+       public class Delete extends OpenStackRequest<Void> {
+
+               private String name;
+
+               public Delete(String name) {
+                       super(CLIENT, HttpMethod.DELETE, new StringBuilder("/os-keypairs/").append(name).toString(), null, Void.class);
+               }
+
+       }
+
+       public class List extends OpenStackRequest<KeyPairs> {
+
+               public List() {
+                       super(CLIENT, HttpMethod.GET, "/os-keypairs", null, KeyPairs.class);
+               }
+
+       }
+       
+}
diff --git a/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/NetworksExtension.java b/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/NetworksExtension.java
new file mode 100644 (file)
index 0000000..ad316e0
--- /dev/null
@@ -0,0 +1,82 @@
+package com.woorea.openstack.nova.api.extensions;
+
+
+import com.woorea.openstack.base.client.Entity;
+import com.woorea.openstack.base.client.HttpMethod;
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.nova.model.Network;
+import com.woorea.openstack.nova.model.Networks;
+
+public class NetworksExtension {
+       
+       private final OpenStackClient CLIENT;
+       
+       public NetworksExtension(OpenStackClient client) {
+               CLIENT = client;
+       }
+       
+       public List list() {
+               return new List();
+       }
+
+       public Show show(String id) {
+               return new Show(id);
+       }
+
+       public Delete delete(String id) {
+               return new Delete(id);
+       }
+
+       public Disassociate disassociate(String id) {
+               return new Disassociate(id);
+       }
+
+       public class List extends OpenStackRequest<Networks> {
+
+
+               public List() {
+                       super(CLIENT, HttpMethod.GET, "/os-networks", null, Networks.class);
+               }
+
+       }
+
+       public class Create extends OpenStackRequest<Network> {
+
+               private Network network;
+
+               public Create(Network network) {
+                       super(CLIENT, HttpMethod.POST, "/os-networks", Entity.json(network), Network.class);
+                       this.network = network;
+               }
+
+       }
+
+       public class Show extends OpenStackRequest<Network> {
+
+               public Show(String id) {
+                       super(CLIENT, HttpMethod.GET, new StringBuilder("/os-networks/").append(id).toString(), null, Network.class);
+               }
+
+       }
+
+       public class Disassociate extends OpenStackRequest<Void> {
+
+               public Disassociate(String id) {
+                       super(CLIENT, HttpMethod.POST, new StringBuilder("/os-networks/").append(id).toString(), Entity.json("{\"action\":\"disassociate\"}"), Void.class);
+                       ;
+               }
+
+       }
+
+       public class Delete extends OpenStackRequest<Void> {
+
+               public Delete(String id) {
+                       super(CLIENT, HttpMethod.DELETE, new StringBuilder("/os-networks/").append(id).toString(), null, Void.class);
+               }
+
+       }
+
+       
+
+}
diff --git a/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/SecurityGroupsExtension.java b/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/SecurityGroupsExtension.java
new file mode 100644 (file)
index 0000000..5a80a10
--- /dev/null
@@ -0,0 +1,184 @@
+package com.woorea.openstack.nova.api.extensions;
+
+
+import com.woorea.openstack.base.client.Entity;
+import com.woorea.openstack.base.client.HttpMethod;
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.nova.model.SecurityGroup;
+import com.woorea.openstack.nova.model.SecurityGroupForCreate;
+import com.woorea.openstack.nova.model.SecurityGroupRuleForCreate;
+import com.woorea.openstack.nova.model.SecurityGroups;
+
+public class SecurityGroupsExtension {
+       
+       private final OpenStackClient CLIENT;
+       
+       public SecurityGroupsExtension(OpenStackClient client) {
+               CLIENT = client;
+       }
+
+       public class List extends OpenStackRequest<SecurityGroups> {
+
+               public List() {
+                       super(CLIENT, HttpMethod.GET, "/os-security-groups", null, SecurityGroups.class);
+               }
+
+       }
+
+       public class Create extends OpenStackRequest<SecurityGroup> {
+
+               private SecurityGroupForCreate securityGroupForCreate;
+
+               public Create(SecurityGroupForCreate securityGroupForCreate) {
+                       super(CLIENT, HttpMethod.POST, "/os-security-groups", Entity.json(securityGroupForCreate), SecurityGroup.class);
+                       this.securityGroupForCreate = securityGroupForCreate;
+               }
+
+       }
+
+       public class Show extends OpenStackRequest<SecurityGroup> {
+
+               /**
+                * @deprecated
+                * @param id
+                */
+               public Show(Integer id) {
+                       super(CLIENT, HttpMethod.GET, new StringBuilder("/os-security-groups/").append(id).toString(), null, SecurityGroup.class);
+               }
+               public Show(String id) {
+                       super(CLIENT, HttpMethod.GET, new StringBuilder("/os-security-groups/").append(id).toString(), null, SecurityGroup.class);
+               }
+
+       }
+
+       public class Delete extends OpenStackRequest<Void> {
+
+               /**
+                * 
+                * @param id
+                * @deprecated
+                */
+               public Delete(Integer id) {
+                       super(CLIENT, HttpMethod.DELETE, new StringBuilder("/os-security-groups/").append(String.valueOf(id)).toString(), null, Void.class);
+               }
+               public Delete(String id) {
+                       super(CLIENT, HttpMethod.DELETE, new StringBuilder("/os-security-groups/").append(id).toString(), null, Void.class);
+               }
+
+       }
+
+       public class CreateRule extends OpenStackRequest<SecurityGroup.Rule> {
+
+               private SecurityGroupRuleForCreate securityGroupRuleForCreate;
+
+               public CreateRule(SecurityGroupRuleForCreate securityGroupRuleForCreate) {
+                       super(CLIENT, HttpMethod.POST, "/os-security-group-rules", Entity.json(securityGroupRuleForCreate), SecurityGroup.Rule.class);
+                       this.securityGroupRuleForCreate = securityGroupRuleForCreate;
+               }
+       }
+
+       public class DeleteRule extends OpenStackRequest<Void> {
+
+               /**
+                * 
+                * @param id
+                * @deprecated
+                */
+               public DeleteRule(Integer id) {
+                       super(CLIENT, HttpMethod.DELETE, new StringBuilder("/os-security-group-rules/").append(String.valueOf(id)).toString(), null, Void.class);
+               }
+               
+               public DeleteRule(String id) {
+                       super(CLIENT, HttpMethod.DELETE, new StringBuilder("/os-security-group-rules/").append(String.valueOf(id)).toString(), null, Void.class);
+               }
+       }
+
+       public List listSecurityGroups() {
+               return new List();
+       }
+
+       public Create createSecurityGroup(String name,
+                       String description) {
+               return new Create(new SecurityGroupForCreate(name, description));
+       }
+
+       public Create createSecurityGroup(String name) {
+               return createSecurityGroup(name, null);
+       }
+
+       public Show showSecurityGroup(Integer id) {
+               return new Show(String.valueOf(id));
+       }
+       
+       public Show showSecurityGroup(String id) {
+               return new Show(id);
+       }
+       public Delete deleteSecurityGroup(Integer id) {
+               return new Delete(String.valueOf(id));
+       }
+       
+       public Delete deleteSecurityGroup(String id) {
+               return new Delete(id);
+       }
+
+       /**
+        * 
+        * @param parentSecurityGroupId
+        * @param ipProtocol
+        * @param fromPort
+        * @param toPort
+        * @param cidr
+        * @return
+        * @deprecated Use {@link #createSecurityGroupRule(String, String, Integer, Integer, String)}
+        */
+       public CreateRule createSecurityGroupRule(
+                       Integer parentSecurityGroupId, String ipProtocol, Integer fromPort,
+                       Integer toPort, String cidr) {
+               SecurityGroupRuleForCreate securityGroupRuleForCreate = new SecurityGroupRuleForCreate(
+                               parentSecurityGroupId, ipProtocol, fromPort, toPort, cidr);
+               return new CreateRule(securityGroupRuleForCreate);
+       }
+       /**
+        * 
+        * @param parentSecurityGroupId
+        * @param ipProtocol
+        * @param fromPort
+        * @param toPort
+        * @param cidr
+        * @return
+        * @deprecated Use {@link #createSecurityGroupRule(String, String, String, Integer, Integer)}
+        */
+       public CreateRule createSecurityGroupRule(
+                       Integer parentSecurityGroupId, String ipProtocol, Integer fromPort,
+                       Integer toPort, Integer sourceGroupId) {
+               SecurityGroupRuleForCreate securityGroupRuleForCreate = new SecurityGroupRuleForCreate(
+                               parentSecurityGroupId, ipProtocol, fromPort, toPort,
+                               sourceGroupId);
+               return new CreateRule(securityGroupRuleForCreate);
+       }
+       
+       public CreateRule createSecurityGroupRule(
+                       String parentSecurityGroupId, String ipProtocol, Integer fromPort,
+                       Integer toPort, String cidr) {
+               SecurityGroupRuleForCreate securityGroupRuleForCreate = new SecurityGroupRuleForCreate(
+                               parentSecurityGroupId, ipProtocol, fromPort, toPort, cidr);
+               return new CreateRule(securityGroupRuleForCreate);
+       }
+
+       public CreateRule createSecurityGroupRule(
+                       String parentSecurityGroupId,String sourceGroupId,String ipProtocol, Integer fromPort,
+                       Integer toPort) {
+               SecurityGroupRuleForCreate securityGroupRuleForCreate = new SecurityGroupRuleForCreate(
+                               parentSecurityGroupId, sourceGroupId,ipProtocol, fromPort, toPort
+                               );
+               return new CreateRule(securityGroupRuleForCreate);
+       }
+       public DeleteRule deleteSecurityGroupRule(String id) {
+               return new DeleteRule(id);
+       }
+       public DeleteRule deleteSecurityGroupRule(Integer id) {
+               return new DeleteRule(String.valueOf(id));
+       }
+
+}
diff --git a/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/SnapshotsExtension.java b/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/SnapshotsExtension.java
new file mode 100644 (file)
index 0000000..62c2542
--- /dev/null
@@ -0,0 +1,86 @@
+package com.woorea.openstack.nova.api.extensions;
+
+
+import com.woorea.openstack.base.client.Entity;
+import com.woorea.openstack.base.client.HttpMethod;
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.nova.model.Metadata;
+import com.woorea.openstack.nova.model.Snapshot;
+import com.woorea.openstack.nova.model.SnapshotForCreate;
+import com.woorea.openstack.nova.model.Snapshots;
+
+public class SnapshotsExtension {
+       
+       private final OpenStackClient CLIENT;
+       
+       public SnapshotsExtension(OpenStackClient client) {
+               CLIENT = client;
+       }
+       
+       public List list(boolean detail) {
+               return new List(detail);
+       }
+       
+       public Create create(SnapshotForCreate snapshotForCreate) {
+               return new Create(snapshotForCreate);
+       }
+       
+       public Show show(String id) {
+               return new Show(id);
+       }
+       
+       public ShowMetadata showMetadata(String id) {
+               return new ShowMetadata(id);
+       }
+
+       
+       public Delete delete(String id) {
+               return new Delete(id);
+       }
+
+       public class List extends OpenStackRequest<Snapshots> {
+               
+               public List(boolean detail) {
+                       super(CLIENT, HttpMethod.GET, detail ? "/os-snapshots/detail" : "/os-snapshots", null, Snapshots.class);
+               }
+
+       }
+       
+       public class Create extends OpenStackRequest<SnapshotForCreate> {
+
+               private SnapshotForCreate snapshotForCreate;
+               
+               public Create(SnapshotForCreate snapshotForCreate) {
+                       super(CLIENT, HttpMethod.POST, "/os-snapshots", Entity.json(snapshotForCreate), SnapshotForCreate.class);
+                       this.snapshotForCreate = snapshotForCreate;
+               }
+               
+       }
+       
+       public class Show extends OpenStackRequest<Snapshot> {
+               
+               public Show(String id) {
+                       super(CLIENT, HttpMethod.GET, new StringBuilder("/os-snapshots/").append(id).toString(), null, Snapshot.class);
+               }
+
+       }
+       
+       public class ShowMetadata extends OpenStackRequest<Metadata> {
+               
+               public ShowMetadata(String id) {
+                       super(CLIENT, HttpMethod.GET, new StringBuilder("/os-snapshots/").append(id).append("/metadata").toString(), null, Metadata.class);
+               }
+
+       }
+       
+       public class Delete extends OpenStackRequest<Void> {
+               
+               public Delete(String id) {
+                       super(CLIENT, HttpMethod.DELETE, new StringBuilder("/os-snapshots/").append(id).toString(), null, Void.class);
+               }
+               
+       }
+       
+}
+
diff --git a/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/VolumesExtension.java b/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/VolumesExtension.java
new file mode 100644 (file)
index 0000000..de35577
--- /dev/null
@@ -0,0 +1,106 @@
+package com.woorea.openstack.nova.api.extensions;
+
+import com.woorea.openstack.base.client.Entity;
+import com.woorea.openstack.base.client.HttpMethod;
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.nova.model.Metadata;
+import com.woorea.openstack.nova.model.Volume;
+import com.woorea.openstack.nova.model.VolumeForCreate;
+import com.woorea.openstack.nova.model.VolumeForImageCreate;
+import com.woorea.openstack.nova.model.Volumes;
+
+public class VolumesExtension {
+
+       private final OpenStackClient CLIENT;
+
+       public VolumesExtension(OpenStackClient client) {
+               CLIENT = client;
+       }
+
+       public List list(boolean detail) {
+               return new List(detail);
+       }
+
+       public Create create(VolumeForCreate volume) {
+               return new Create(volume);
+       }
+
+       public UploadToImage uploadToImage(VolumeForImageCreate volumeForImage) {
+               return new UploadToImage(volumeForImage);
+       }
+
+       public Show show(String id) {
+               return new Show(id);
+       }
+
+       public ShowMetadata showMetadata(String id) {
+               return new ShowMetadata(id);
+       }
+
+       public Delete delete(String id) {
+               return new Delete(id);
+       }
+
+       public class List extends OpenStackRequest<Volumes> {
+
+               public List(boolean detail) {
+                       super(CLIENT, HttpMethod.GET, detail ? "/os-volumes/detail"
+                                       : "/os-volumes", null, Volumes.class);
+               }
+
+       }
+
+       public class Create extends OpenStackRequest<Volume> {
+
+               // private Volume volume;
+
+               public Create(VolumeForCreate volume) {
+                       super(CLIENT, HttpMethod.POST, "/os-volumes", Entity.json(volume),
+                                       Volume.class);
+                       // this.volume = volume;
+               }
+
+       }
+
+       // Upload volume to image service as image
+
+       public class UploadToImage extends OpenStackRequest<Void> {
+
+               public UploadToImage(VolumeForImageCreate volumeForImageCreate) {
+                       super(CLIENT, HttpMethod.POST, new StringBuilder("/volumes/")
+                                       .append(volumeForImageCreate.getVolumeId() + "/action"),
+                                       Entity.json(volumeForImageCreate), Void.class);
+               }
+
+       }
+
+       public class Show extends OpenStackRequest<Volume> {
+
+               public Show(String id) {
+                       super(CLIENT, HttpMethod.GET, new StringBuilder("/os-volumes/")
+                                       .append(id).toString(), null, Volume.class);
+               }
+
+       }
+
+       public class ShowMetadata extends OpenStackRequest<Metadata> {
+
+               public ShowMetadata(String id) {
+                       super(CLIENT, HttpMethod.GET, new StringBuilder("/os-volumes/")
+                                       .append(id).append("/metadata").toString(), null,
+                                       Metadata.class);
+               }
+
+       }
+
+       public class Delete extends OpenStackRequest<Void> {
+
+               public Delete(String id) {
+                       super(CLIENT, HttpMethod.DELETE, new StringBuilder("/os-volumes/")
+                                       .append(id).toString(), null, Void.class);
+               }
+
+       }
+
+}
diff --git a/nova-model/pom.xml b/nova-model/pom.xml
new file mode 100644 (file)
index 0000000..8e4c550
--- /dev/null
@@ -0,0 +1,12 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+       <modelVersion>4.0.0</modelVersion>
+       <parent>
+               <groupId>org.openecomp.mso.libs</groupId>
+               <artifactId>openstack-java-sdk</artifactId>
+               <version>1.0.0-SNAPSHOT</version>
+       </parent>
+       <groupId>org.openecomp.mso.libs.openstack-java-sdk</groupId>
+       <artifactId>nova-model</artifactId>
+       <name>OpenStack Nova Model</name>
+       <description>OpenStack Nova Model</description>
+</project>
\ No newline at end of file
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/Certificate.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/Certificate.java
new file mode 100644 (file)
index 0000000..b69eb3c
--- /dev/null
@@ -0,0 +1,36 @@
+package com.woorea.openstack.nova.model;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("certificate")
+public class Certificate {
+
+       private String data;
+       
+       @JsonProperty("private_key")
+       private String privateKey;
+
+       /**
+        * @return the data
+        */
+       public String getData() {
+               return data;
+       }
+
+       /**
+        * @return the privateKey
+        */
+       public String getPrivateKey() {
+               return privateKey;
+       }
+
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Certificate [data=" + data + ", privateKey=" + privateKey + "]";
+       }
+       
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/Cloudpipe.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/Cloudpipe.java
new file mode 100644 (file)
index 0000000..69d1b5a
--- /dev/null
@@ -0,0 +1,134 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+import java.util.Calendar;
+
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("cloudpipe")
+public class Cloudpipe implements Serializable {
+       
+       private String projectId;
+       
+       private String internalIp;
+       
+       private String publicIp;
+       
+       private String publicPort;
+       
+       private String state;
+       
+       private String instanceId;
+       
+       private Calendar createdAt;
+
+       /**
+        * @return the projectId
+        */
+       public String getProjectId() {
+               return projectId;
+       }
+
+       /**
+        * @param projectId the projectId to set
+        */
+       public void setProjectId(String projectId) {
+               this.projectId = projectId;
+       }
+
+       /**
+        * @return the internalIp
+        */
+       public String getInternalIp() {
+               return internalIp;
+       }
+
+       /**
+        * @param internalIp the internalIp to set
+        */
+       public void setInternalIp(String internalIp) {
+               this.internalIp = internalIp;
+       }
+
+       /**
+        * @return the publicIp
+        */
+       public String getPublicIp() {
+               return publicIp;
+       }
+
+       /**
+        * @param publicIp the publicIp to set
+        */
+       public void setPublicIp(String publicIp) {
+               this.publicIp = publicIp;
+       }
+
+       /**
+        * @return the publicPort
+        */
+       public String getPublicPort() {
+               return publicPort;
+       }
+
+       /**
+        * @param publicPort the publicPort to set
+        */
+       public void setPublicPort(String publicPort) {
+               this.publicPort = publicPort;
+       }
+
+       /**
+        * @return the state
+        */
+       public String getState() {
+               return state;
+       }
+
+       /**
+        * @param state the state to set
+        */
+       public void setState(String state) {
+               this.state = state;
+       }
+
+       /**
+        * @return the instanceId
+        */
+       public String getInstanceId() {
+               return instanceId;
+       }
+
+       /**
+        * @param instanceId the instanceId to set
+        */
+       public void setInstanceId(String instanceId) {
+               this.instanceId = instanceId;
+       }
+
+       /**
+        * @return the createdAt
+        */
+       public Calendar getCreatedAt() {
+               return createdAt;
+       }
+
+       /**
+        * @param createdAt the createdAt to set
+        */
+       public void setCreatedAt(Calendar createdAt) {
+               this.createdAt = createdAt;
+       }
+
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "CloudPipe [projectId=" + projectId + ", internalIp="
+                               + internalIp + ", publicIp=" + publicIp + ", publicPort="
+                               + publicPort + ", state=" + state + ", instanceId="
+                               + instanceId + ", createdAt=" + createdAt + "]";
+       }
+       
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/Cloudpipes.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/Cloudpipes.java
new file mode 100644 (file)
index 0000000..3a3f13e
--- /dev/null
@@ -0,0 +1,28 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class Cloudpipes implements Serializable {
+
+       @JsonProperty("cloudpipes")
+       private List<Cloudpipe> list;
+
+       /**
+        * @return the list
+        */
+       public List<Cloudpipe> getList() {
+               return list;
+       }
+       
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Flavors [list=" + list + "]";
+       }
+       
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/Extension.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/Extension.java
new file mode 100644 (file)
index 0000000..20892b7
--- /dev/null
@@ -0,0 +1,75 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+import java.util.Calendar;
+import java.util.List;
+
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("extension")
+public class Extension implements Serializable {
+
+       private String alias;
+       
+       private String description;
+       
+       private String name;
+       
+       private String namespace;
+       
+       private Calendar updated;
+       
+       private List<Link> links;
+
+       /**
+        * @return the alias
+        */
+       public String getAlias() {
+               return alias;
+       }
+
+       /**
+        * @return the description
+        */
+       public String getDescription() {
+               return description;
+       }
+
+       /**
+        * @return the name
+        */
+       public String getName() {
+               return name;
+       }
+
+       /**
+        * @return the namespace
+        */
+       public String getNamespace() {
+               return namespace;
+       }
+
+       /**
+        * @return the updated
+        */
+       public Calendar getUpdated() {
+               return updated;
+       }
+
+       /**
+        * @return the links
+        */
+       public List<Link> getLinks() {
+               return links;
+       }
+
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Extension [alias=" + alias + ", description=" + description
+                               + ", name=" + name + ", namespace=" + namespace + "]";
+       }
+       
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/Extensions.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/Extensions.java
new file mode 100644 (file)
index 0000000..5d049d9
--- /dev/null
@@ -0,0 +1,34 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class Extensions implements Iterable<Extension>, Serializable {
+
+       @JsonProperty("extensions")
+       private List<Extension> list;
+
+       /**
+        * @return the list
+        */
+       public List<Extension> getList() {
+               return list;
+       }
+       
+       @Override
+       public Iterator<Extension> iterator() {
+               return list.iterator();
+       }
+       
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Extensions [list=" + list + "]";
+       }
+
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/Flavor.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/Flavor.java
new file mode 100644 (file)
index 0000000..1076062
--- /dev/null
@@ -0,0 +1,239 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("flavor")
+public class Flavor implements Serializable {
+
+       private String id;
+       
+       private String name;
+       
+       private Integer vcpus;
+       
+       private Integer ram;
+       
+       private Integer disk;
+       
+       @JsonProperty("OS-FLV-EXT-DATA:ephemeral")
+       private Integer ephemeral;
+       
+       private String swap;
+       
+       @JsonProperty("rxtx_factor")
+       private Float rxtxFactor;
+       
+       @JsonProperty("OS-FLV-DISABLED:disabled")
+       private Boolean disabled;
+       
+       @JsonProperty("rxtx_quota")
+       private Integer rxtxQuota;
+       
+       @JsonProperty("rxtx_cap")
+       private Integer rxtxCap;
+       
+       private List<Link> links;
+       
+       @JsonProperty("os-flavor-access:is_public")
+       private Boolean isPublic;
+
+       /**
+        * @return the id
+        */
+       public String getId() {
+               return id;
+       }
+
+       /**
+        * @param id the id to set
+        */
+       public void setId(String id) {
+               this.id = id;
+       }
+
+       /**
+        * @return the name
+        */
+       public String getName() {
+               return name;
+       }
+
+       /**
+        * @param name the name to set
+        */
+       public void setName(String name) {
+               this.name = name;
+       }
+
+       /**
+        * @return the vcpus
+        */
+       public Integer getVcpus() {
+               return vcpus;
+       }
+
+       /**
+        * @param vcpus the vcpus to set
+        */
+       public void setVcpus(Integer vcpus) {
+               this.vcpus = vcpus;
+       }
+
+       /**
+        * @return the ram
+        */
+       public Integer getRam() {
+               return ram;
+       }
+
+       /**
+        * @param ram the ram to set
+        */
+       public void setRam(Integer ram) {
+               this.ram = ram;
+       }
+
+       /**
+        * @return the disk
+        */
+       public Integer getDisk() {
+               return disk;
+       }
+
+       /**
+        * @param disk the disk to set
+        */
+       public void setDisk(Integer disk) {
+               this.disk = disk;
+       }
+
+       /**
+        * @return the ephemeral
+        */
+       public Integer getEphemeral() {
+               return ephemeral;
+       }
+
+       /**
+        * @param ephemeral the ephemeral to set
+        */
+       public void setEphemeral(Integer ephemeral) {
+               this.ephemeral = ephemeral;
+       }
+
+       /**
+        * @return the swap
+        */
+       public String getSwap() {
+               return swap;
+       }
+
+       /**
+        * @param swap the swap to set
+        */
+       public void setSwap(String swap) {
+               this.swap = swap;
+       }
+
+       /**
+        * @return the rxtxFactor
+        */
+       public Float getRxtxFactor() {
+               return rxtxFactor;
+       }
+
+       /**
+        * @param rxtxFactor the rxtxFactor to set
+        */
+       public void setRxtxFactor(Float rxtxFactor) {
+               this.rxtxFactor = rxtxFactor;
+       }
+
+       /**
+        * @return the rxtxQuota
+        */
+       public Integer getRxtxQuota() {
+               return rxtxQuota;
+       }
+
+       /**
+        * @param rxtxQuota the rxtxQuota to set
+        */
+       public void setRxtxQuota(Integer rxtxQuota) {
+               this.rxtxQuota = rxtxQuota;
+       }
+
+       /**
+        * @return the rxtxCap
+        */
+       public Integer getRxtxCap() {
+               return rxtxCap;
+       }
+
+       /**
+        * @param rxtxCap the rxtxCap to set
+        */
+       public void setRxtxCap(Integer rxtxCap) {
+               this.rxtxCap = rxtxCap;
+       }
+
+       /**
+        * @return the disabled
+        */
+       public Boolean getDisabled() {
+               return disabled;
+       }
+
+       /**
+        * @param disabled the disabled to set
+        */
+       public void setDisabled(Boolean disabled) {
+               this.disabled = disabled;
+       }
+       
+       /**
+        * @return the isPublic
+        */
+       public Boolean isPublic() {
+               return isPublic;
+       }
+
+       /**
+        * @param isPublic the isPublic to set
+        */
+       public void setPublic(Boolean isPublic) {
+               this.isPublic = isPublic;
+       }
+
+       /**
+        * @return the links
+        */
+       public List<Link> getLinks() {
+               return links;
+       }
+
+       /**
+        * @param links the links to set
+        */
+       public void setLinks(List<Link> links) {
+               this.links = links;
+       }
+
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Flavor [id=" + id + ", name=" + name + ", vcpus=" + vcpus
+                               + ", ram=" + ram + ", disk=" + disk + ", ephemeral="
+                               + ephemeral + ", swap=" + swap + ", rxtxFactor=" + rxtxFactor
+                               + ", disabled=" + disabled + ", rxtxQuota=" + rxtxQuota
+                               + ", rxtxCap=" + rxtxCap + ", links=" + links + ", isPublic="
+                               + isPublic + "]";
+       }
+       
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/FlavorForCreate.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/FlavorForCreate.java
new file mode 100644 (file)
index 0000000..295096d
--- /dev/null
@@ -0,0 +1,142 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("flavor")
+public class FlavorForCreate implements Serializable {
+       
+       private String id;
+       
+       private String name;
+       
+       private String vcpus;
+       
+       private Integer ram;
+       
+       private String disk;
+       
+       @JsonProperty("OS-FLV-EXT-DATA:ephemeral")
+       private Integer ephemeral;
+       
+       private String swap;
+       
+       @JsonProperty("rxtx_factor")
+       private Float rxtxFactor;
+
+       /**
+        * @return the id
+        */
+       public String getId() {
+               return id;
+       }
+
+       /**
+        * @param id the id to set
+        */
+       public void setId(String id) {
+               this.id = id;
+       }
+
+       /**
+        * @return the name
+        */
+       public String getName() {
+               return name;
+       }
+
+       /**
+        * @param name the name to set
+        */
+       public void setName(String name) {
+               this.name = name;
+       }
+
+       /**
+        * @return the vcpus
+        */
+       public String getVcpus() {
+               return vcpus;
+       }
+
+       /**
+        * @param vcpus the vcpus to set
+        */
+       public void setVcpus(String vcpus) {
+               this.vcpus = vcpus;
+       }
+
+       /**
+        * @return the ram
+        */
+       public Integer getRam() {
+               return ram;
+       }
+
+       /**
+        * @param ram the ram to set
+        */
+       public void setRam(Integer ram) {
+               this.ram = ram;
+       }
+
+       /**
+        * @return the disk
+        */
+       public String getDisk() {
+               return disk;
+       }
+
+       /**
+        * @param disk the disk to set
+        */
+       public void setDisk(String disk) {
+               this.disk = disk;
+       }
+
+       /**
+        * @return the ephemeral
+        */
+       public Integer getEphemeral() {
+               return ephemeral;
+       }
+
+       /**
+        * @param ephemeral the ephemeral to set
+        */
+       public void setEphemeral(Integer ephemeral) {
+               this.ephemeral = ephemeral;
+       }
+
+       /**
+        * @return the swap
+        */
+       public String getSwap() {
+               return swap;
+       }
+
+       /**
+        * @param swap the swap to set
+        */
+       public void setSwap(String swap) {
+               this.swap = swap;
+       }
+
+       /**
+        * @return the rxtxFactor
+        */
+       public Float getRxtxFactor() {
+               return rxtxFactor;
+       }
+
+       /**
+        * @param rxtxFactor the rxtxFactor to set
+        */
+       public void setRxtxFactor(Float rxtxFactor) {
+               this.rxtxFactor = rxtxFactor;
+       }
+       
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/Flavors.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/Flavors.java
new file mode 100644 (file)
index 0000000..0337a3b
--- /dev/null
@@ -0,0 +1,34 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class Flavors implements Iterable<Flavor>, Serializable {
+
+       @JsonProperty("flavors")
+       private List<Flavor> list;
+
+       /**
+        * @return the list
+        */
+       public List<Flavor> getList() {
+               return list;
+       }
+       
+       @Override
+       public Iterator<Flavor> iterator() {
+               return list.iterator();
+       }
+       
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Flavors [list=" + list + "]";
+       }
+
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/FloatingIp.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/FloatingIp.java
new file mode 100644 (file)
index 0000000..3eda923
--- /dev/null
@@ -0,0 +1,67 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("floating_ip")
+public class FloatingIp implements Serializable {
+
+       private String id;
+       
+       private String pool;
+       
+       private String ip;
+       
+       @JsonProperty("fixed_ip")
+       private String fixedIp;
+       
+       @JsonProperty("instance_id")
+       private String instanceId;
+
+       /**
+        * @return the id
+        */
+       public String getId() {
+               return id;
+       }
+
+       /**
+        * @return the pool
+        */
+       public String getPool() {
+               return pool;
+       }
+
+       /**
+        * @return the ip
+        */
+       public String getIp() {
+               return ip;
+       }
+
+       /**
+        * @return the fixedIp
+        */
+       public String getFixedIp() {
+               return fixedIp;
+       }
+
+       /**
+        * @return the instanceId
+        */
+       public String getInstanceId() {
+               return instanceId;
+       }
+
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "FloatingIp [id=" + id + ", pool=" + pool + ", ip=" + ip
+                               + ", fixedIp=" + fixedIp + ", instanceId=" + instanceId + "]";
+       }
+       
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/FloatingIpDomain.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/FloatingIpDomain.java
new file mode 100644 (file)
index 0000000..4a6a280
--- /dev/null
@@ -0,0 +1,58 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("floating-ip-pool")
+public class FloatingIpDomain implements Serializable {
+
+       private String domain;
+       
+       private String scope;
+       
+       private String project;
+       
+       @JsonProperty("availabilityZone")
+       private String availabilityZone;
+
+       /**
+        * @return the domain
+        */
+       public String getDomain() {
+               return domain;
+       }
+
+       /**
+        * @return the scope
+        */
+       public String getScope() {
+               return scope;
+       }
+
+       /**
+        * @return the project
+        */
+       public String getProject() {
+               return project;
+       }
+
+       /**
+        * @return the availabilityZone
+        */
+       public String getAvailabilityZone() {
+               return availabilityZone;
+       }
+
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "FloatingIpDomain [domain=" + domain + ", scope=" + scope
+                               + ", project=" + project + ", availabilityZone="
+                               + availabilityZone + "]";
+       }
+       
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/FloatingIpDomains.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/FloatingIpDomains.java
new file mode 100644 (file)
index 0000000..292b59f
--- /dev/null
@@ -0,0 +1,34 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class FloatingIpDomains implements Iterable<FloatingIpDomain>, Serializable {
+
+       @JsonProperty("domain_entries")
+       private List<FloatingIpDomain> list;
+
+       /**
+        * @return the list
+        */
+       public List<FloatingIpDomain> getList() {
+               return list;
+       }
+
+       @Override
+       public Iterator<FloatingIpDomain> iterator() {
+               return list.iterator();
+       }
+
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "FloatingIpDomains [list=" + list + "]";
+       }
+       
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/FloatingIpPools.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/FloatingIpPools.java
new file mode 100644 (file)
index 0000000..db1c0e3
--- /dev/null
@@ -0,0 +1,57 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+import com.woorea.openstack.nova.model.FloatingIpPools.FloatingIpPool;
+
+public class FloatingIpPools implements Iterable<FloatingIpPool>, Serializable {
+       
+       public static class FloatingIpPool implements Serializable {
+
+               private String name;
+
+               /**
+                * @return the name
+                */
+               public String getName() {
+                       return name;
+               }
+
+               /* (non-Javadoc)
+                * @see java.lang.Object#toString()
+                */
+               @Override
+               public String toString() {
+                       return "FloatingIpPool [name=" + name + "]";
+               }
+               
+       }
+
+       @JsonProperty("floating_ip_pools")
+       private List<FloatingIpPool> list;
+
+       /**
+        * @return the list
+        */
+       public List<FloatingIpPool> getList() {
+               return list;
+       }
+       
+       @Override
+       public Iterator<FloatingIpPool> iterator() {
+               return list.iterator();
+       }
+       
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "FloatingIpPools [list=" + list + "]";
+       }
+
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/FloatingIps.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/FloatingIps.java
new file mode 100644 (file)
index 0000000..776c4ca
--- /dev/null
@@ -0,0 +1,34 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class FloatingIps implements Iterable<FloatingIp>, Serializable {
+
+       @JsonProperty("floating_ips")
+       private List<FloatingIp> list;
+
+       /**
+        * @return the list
+        */
+       public List<FloatingIp> getList() {
+               return list;
+       }
+       
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "FloatingIps [list=" + list + "]";
+       }
+
+       @Override
+       public Iterator<FloatingIp> iterator() {
+               return list.iterator();
+       }
+       
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/Host.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/Host.java
new file mode 100644 (file)
index 0000000..4050964
--- /dev/null
@@ -0,0 +1,109 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class Host implements Serializable {
+       
+       public static final class ResourceWrapper implements Serializable {
+               
+               public static final class Resource implements Serializable {
+                       
+                       private String project;
+                       
+                       @JsonProperty("memory_mb")
+                       private Integer memoryMb;
+                       
+                       private String host;
+                       
+                       private Integer cpu;
+                       
+                       @JsonProperty("disk_gb")
+                       private Integer diskGb;
+
+                       /**
+                        * @return the project
+                        */
+                       public String getProject() {
+                               return project;
+                       }
+
+                       /**
+                        * @return the memoryMb
+                        */
+                       public Integer getMemoryMb() {
+                               return memoryMb;
+                       }
+
+                       /**
+                        * @return the host
+                        */
+                       public String getHost() {
+                               return host;
+                       }
+
+                       /**
+                        * @return the cpu
+                        */
+                       public Integer getCpu() {
+                               return cpu;
+                       }
+
+                       /**
+                        * @return the diskGb
+                        */
+                       public Integer getDiskGb() {
+                               return diskGb;
+                       }
+
+                       /* (non-Javadoc)
+                        * @see java.lang.Object#toString()
+                        */
+                       @Override
+                       public String toString() {
+                               return "Resource [project=" + project + ", memoryMb="
+                                               + memoryMb + ", host=" + host + ", cpu=" + cpu
+                                               + ", diskGb=" + diskGb + "]";
+                       }
+                       
+               }
+               
+               private Resource resource;
+
+               /**
+                * @return the resource
+                */
+               public Resource getResource() {
+                       return resource;
+               }
+
+               /* (non-Javadoc)
+                * @see java.lang.Object#toString()
+                */
+               @Override
+               public String toString() {
+                       return "ResourceWrapper [resource=" + resource + "]";
+               }
+               
+       }
+
+       private List<ResourceWrapper> host;
+
+       /**
+        * @return the host
+        */
+       public List<ResourceWrapper> getHost() {
+               return host;
+       }
+
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Host [host=" + host + "]";
+       }
+       
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/HostAggregate.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/HostAggregate.java
new file mode 100644 (file)
index 0000000..ad68faa
--- /dev/null
@@ -0,0 +1,110 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("aggregate")
+public class HostAggregate implements Serializable {
+       
+       private String id;
+
+       private String name;
+       
+       @JsonProperty("availability_zone")
+       private String availabilityZone;
+       
+       @JsonProperty("created_at")
+       private String createdAt;
+       
+       @JsonProperty("updated_at")
+       private String updatedAt;
+       
+       @JsonProperty("deleted_at")
+       private String deletedAt;
+       
+       private Boolean deleted;
+       
+       private List<String> hosts;
+       
+       private Map<String, String> metadata;
+
+       /**
+        * @return the id
+        */
+       public String getId() {
+               return id;
+       }
+
+       /**
+        * @return the name
+        */
+       public String getName() {
+               return name;
+       }
+
+       /**
+        * @return the availabilityZone
+        */
+       public String getAvailabilityZone() {
+               return availabilityZone;
+       }
+
+       /**
+        * @return the createdAt
+        */
+       public String getCreatedAt() {
+               return createdAt;
+       }
+
+       /**
+        * @return the updatedAt
+        */
+       public String getUpdatedAt() {
+               return updatedAt;
+       }
+
+       /**
+        * @return the deletedAt
+        */
+       public String getDeletedAt() {
+               return deletedAt;
+       }
+
+       /**
+        * @return the deleted
+        */
+       public Boolean getDeleted() {
+               return deleted;
+       }
+
+       /**
+        * @return the hosts
+        */
+       public List<String> getHosts() {
+               return hosts;
+       }
+
+       /**
+        * @return the metadata
+        */
+       public Map<String, String> getMetadata() {
+               return metadata;
+       }
+
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "HostAggregate [id=" + id + ", name=" + name
+                               + ", availabilityZone=" + availabilityZone + ", createdAt="
+                               + createdAt + ", updatedAt=" + updatedAt + ", deletedAt="
+                               + deletedAt + ", deleted=" + deleted + ", hosts=" + hosts
+                               + ", metadata=" + metadata + "]";
+       }
+       
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/HostAggregates.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/HostAggregates.java
new file mode 100644 (file)
index 0000000..6810e83
--- /dev/null
@@ -0,0 +1,34 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class HostAggregates implements Iterable<HostAggregate>, Serializable {
+
+       @JsonProperty("aggregates")
+       private List<HostAggregate> list;
+
+       /**
+        * @return the list
+        */
+       public List<HostAggregate> getList() {
+               return list;
+       }
+       
+       @Override
+       public Iterator<HostAggregate> iterator() {
+               return list.iterator();
+       }
+       
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "HostAggregates [list=" + list + "]";
+       }
+
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/Hosts.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/Hosts.java
new file mode 100644 (file)
index 0000000..1bac38e
--- /dev/null
@@ -0,0 +1,77 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class Hosts implements Iterable<Hosts.Host>, Serializable {
+       
+       public static final class Host {
+               
+               private String zone;
+               
+               @JsonProperty("host_name")
+               private String hostName;
+               
+               private String service;
+
+               /**
+                * @return the hostName
+                */
+               public String getHostName() {
+                       return hostName;
+               }
+
+               /**
+                * @return the service
+                */
+               public String getService() {
+                       return service;
+               }
+               
+               public String getZone() {
+                       return zone;
+               }
+
+               public void setZone(String zone) {
+                       this.zone = zone;
+               }
+
+               /* (non-Javadoc)
+                * @see java.lang.Object#toString()
+                */
+               @Override
+               public String toString() {
+                       return "Host [hostName=" + hostName + ", service=" + service + "]";
+               }
+               
+       }
+
+       @JsonProperty("hosts")
+       private List<Host> list;
+
+       /**
+        * @return the list
+        */
+       public List<Host> getList() {
+               return list;
+       }
+       
+       @Override
+       public Iterator<Hosts.Host> iterator() {
+               return list.iterator();
+       }
+       
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Hosts [list=" + list + "]";
+       }
+
+       
+       
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/Image.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/Image.java
new file mode 100644 (file)
index 0000000..93949f2
--- /dev/null
@@ -0,0 +1,232 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+import java.util.Calendar;
+import java.util.List;
+import java.util.Map;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("image")
+public class Image implements Serializable {
+       
+       public static final class Server implements Serializable {
+               
+               private String id;
+               
+               private List<Link> links;
+               
+               /**
+                * @return the id
+                */
+               public String getId() {
+                       return id;
+               }
+               
+               /**
+                * @return the links
+                */
+               public List<Link> getLinks() {
+                       return links;
+               }
+               
+               @Override
+               public String toString() {
+                       return "Server [id=" + id + ", links=" + links + "]";
+               }
+               
+       }
+
+       private String id;
+       
+       private String status;
+       
+       private String name;
+       
+       private Integer progress;
+       
+       private Integer minRam;
+       
+       private Integer minDisk;
+       
+       private Calendar created;
+       
+       private Calendar updated;
+       
+       @JsonProperty("OS-EXT-IMG-SIZE:size")
+       private Long size;
+       
+       private Map<String, String> metadata;
+       
+       private Server server;
+               
+       private List<Link> links;
+
+       /**
+        * @return the id
+        */
+       public String getId() {
+               return id;
+       }
+
+       /**
+        * @param id the id to set
+        */
+       public void setId(String id) {
+               this.id = id;
+       }
+
+       /**
+        * @return the status
+        */
+       public String getStatus() {
+               return status;
+       }
+
+       /**
+        * @param status the status to set
+        */
+       public void setStatus(String status) {
+               this.status = status;
+       }
+
+       /**
+        * @return the name
+        */
+       public String getName() {
+               return name;
+       }
+
+       /**
+        * @param name the name to set
+        */
+       public void setName(String name) {
+               this.name = name;
+       }
+
+       /**
+        * @return the progress
+        */
+       public Integer getProgress() {
+               return progress;
+       }
+
+       /**
+        * @param progress the progress to set
+        */
+       public void setProgress(Integer progress) {
+               this.progress = progress;
+       }
+
+       /**
+        * @return the minRam
+        */
+       public Integer getMinRam() {
+               return minRam;
+       }
+
+       /**
+        * @param minRam the minRam to set
+        */
+       public void setMinRam(Integer minRam) {
+               this.minRam = minRam;
+       }
+
+       /**
+        * @return the minDisk
+        */
+       public Integer getMinDisk() {
+               return minDisk;
+       }
+
+       /**
+        * @param minDisk the minDisk to set
+        */
+       public void setMinDisk(Integer minDisk) {
+               this.minDisk = minDisk;
+       }
+
+       /**
+        * @return the created
+        */
+       public Calendar getCreated() {
+               return created;
+       }
+
+       /**
+        * @param created the created to set
+        */
+       public void setCreated(Calendar created) {
+               this.created = created;
+       }
+
+       /**
+        * @return the updated
+        */
+       public Calendar getUpdated() {
+               return updated;
+       }
+
+       /**
+        * @param updated the updated to set
+        */
+       public void setUpdated(Calendar updated) {
+               this.updated = updated;
+       }
+
+       /**
+        * @return the metadata
+        */
+       public Map<String, String> getMetadata() {
+               return metadata;
+       }
+
+       /**
+        * @return the size
+        */
+       public Long getSize() {
+               return size;
+       }
+
+       /**
+        * @param metadata the metadata to set
+        */
+       public void setMetadata(Map<String, String> metadata) {
+               this.metadata = metadata;
+       }
+       
+       /**
+        * @return the server
+        */
+       public Server getServer() {
+               return server;
+       }
+
+       /**
+        * @return the links
+        */
+       public List<Link> getLinks() {
+               return links;
+       }
+
+       /**
+        * @param links the links to set
+        */
+       public void setLinks(List<Link> links) {
+               this.links = links;
+       }
+
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Image [id=" + id + ", status=" + status + ", name=" + name
+                               + ", progress=" + progress + ", minRam=" + minRam
+                               + ", minDisk=" + minDisk + ", created=" + (created != null ? created.getTime() : null)
+                               + ", updated=" + (updated != null ? updated.getTime() : null) + ", size=" + size + ", metadata="
+                               + metadata + ", server="+server+", links=" + links + "]";
+       }
+       
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/ImageFromVolume.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/ImageFromVolume.java
new file mode 100644 (file)
index 0000000..30e38d8
--- /dev/null
@@ -0,0 +1,112 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("os-volume_upload_image")
+public class ImageFromVolume implements Serializable {
+
+       @JsonProperty("id")
+       String id;
+       @JsonProperty("updates_at")
+       String updates_at;
+       @JsonProperty("status")
+       String status;
+       @JsonProperty("display_description")
+       String display_description;
+       @JsonProperty("size")
+       String size;
+       @JsonProperty("volume_type")
+       String volume_type;
+       @JsonProperty("image_id")
+       String image_id;
+       @JsonProperty("container_format")
+       String container_format;
+       @JsonProperty("disk_format")
+       String disk_format;
+       @JsonProperty("image_name")
+       String image_name;
+
+       public String getId() {
+               return id;
+       }
+
+       public void setId(String id) {
+               this.id = id;
+       }
+
+       public String getUpdates_at() {
+               return updates_at;
+       }
+
+       public void setUpdates_at(String updates_at) {
+               this.updates_at = updates_at;
+       }
+
+       public String getStatus() {
+               return status;
+       }
+
+       public void setStatus(String status) {
+               this.status = status;
+       }
+
+       public String getDisplay_description() {
+               return display_description;
+       }
+
+       public void setDisplay_description(String display_description) {
+               this.display_description = display_description;
+       }
+
+       public String getSize() {
+               return size;
+       }
+
+       public void setSize(String size) {
+               this.size = size;
+       }
+
+       public String getVolume_type() {
+               return volume_type;
+       }
+
+       public void setVolume_type(String volume_type) {
+               this.volume_type = volume_type;
+       }
+
+       public String getImage_id() {
+               return image_id;
+       }
+
+       public void setImage_id(String image_id) {
+               this.image_id = image_id;
+       }
+
+       public String getContainer_format() {
+               return container_format;
+       }
+
+       public void setContainer_format(String container_format) {
+               this.container_format = container_format;
+       }
+
+       public String getDisk_format() {
+               return disk_format;
+       }
+
+       public void setDisk_format(String disk_format) {
+               this.disk_format = disk_format;
+       }
+
+       public String getImage_name() {
+               return image_name;
+       }
+
+       public void setImage_name(String image_name) {
+               this.image_name = image_name;
+       }
+
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/Images.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/Images.java
new file mode 100644 (file)
index 0000000..e678e97
--- /dev/null
@@ -0,0 +1,35 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class Images implements Iterable<Image>, Serializable {
+
+       @JsonProperty("images")
+       private List<Image> list;
+
+       /**
+        * @return the list
+        */
+       public List<Image> getList() {
+               return list;
+       }
+       
+       @Override
+       public Iterator<Image> iterator() {
+               return list.iterator();
+       }
+       
+       
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Images [list=" + list + "]";
+       }
+
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/KeyPair.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/KeyPair.java
new file mode 100644 (file)
index 0000000..b2fdb34
--- /dev/null
@@ -0,0 +1,98 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("keypair")
+public class KeyPair implements Serializable {
+
+       private String name;
+       
+       @JsonProperty("user_id")
+       private String userId;
+       
+       @JsonProperty("public_key")
+       private String publicKey;
+       
+       @JsonProperty("private_key")
+       private String privateKey;
+       
+       private String fingerprint;
+
+       public KeyPair() {
+               super();
+       }
+       
+       public KeyPair(String name) {
+               this.name = name;
+       }
+       
+       public KeyPair(String name, String publicKey) {
+               this(name);
+               this.publicKey = publicKey;
+       }
+
+       /**
+        * @return the name
+        */
+       public String getName() {
+               return name;
+       }
+
+       /**
+        * @param name the name to set
+        */
+       public void setName(String name) {
+               this.name = name;
+       }
+
+       /**
+        * @return the userId
+        */
+       public String getUserId() {
+               return userId;
+       }
+
+       /**
+        * @return the publicKey
+        */
+       public String getPublicKey() {
+               return publicKey;
+       }
+
+       /**
+        * @param publicKey the publicKey to set
+        */
+       public void setPublicKey(String publicKey) {
+               this.publicKey = publicKey;
+       }
+
+       /**
+        * @return the privateKey
+        */
+       public String getPrivateKey() {
+               return privateKey;
+       }
+
+       /**
+        * @return the fingerprint
+        */
+       public String getFingerprint() {
+               return fingerprint;
+       }
+
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "KeyPair [name=" + name + ", userId=" + userId + ", publicKey="
+                               + publicKey + ", privateKey=" + privateKey + ", fingerprint="
+                               + fingerprint + "]";
+       }
+
+       
+       
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/KeyPairs.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/KeyPairs.java
new file mode 100644 (file)
index 0000000..62f158f
--- /dev/null
@@ -0,0 +1,46 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class KeyPairs implements Iterable<KeyPair>, Serializable {
+       
+       public static final class KeyPairWrapper implements Serializable {
+               
+               @JsonProperty
+               private KeyPair keypair;
+               
+       }
+
+       @JsonProperty("keypairs")
+       private List<KeyPairWrapper> list;
+
+       /**
+        * @return the list
+        */
+       public List<KeyPair> getList() {
+               List<KeyPair> list = new ArrayList<KeyPair>();
+               for(KeyPairWrapper wrapper : this.list) {
+                       list.add(wrapper.keypair);
+               }
+               return list;
+       }
+       
+       @Override
+       public Iterator<KeyPair> iterator() {
+               return getList().iterator();
+       }
+       
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "KeyPairs [list=" + getList() + "]";
+       }
+
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/Limits.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/Limits.java
new file mode 100644 (file)
index 0000000..86e9acf
--- /dev/null
@@ -0,0 +1,394 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+import java.util.Calendar;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("limits")
+public class Limits implements Serializable {
+
+       public static final class RateLimit implements Serializable {
+
+               public static final class LimitEntry implements Serializable {
+
+                       @JsonProperty("next-available")
+                       private Calendar nextAvailable;
+
+                       private String unit;
+
+                       private String verb;
+
+                       private Integer remaining;
+
+                       private Integer available;
+
+                       private Integer value;
+
+                       /**
+                        * @return the nextAvailable
+                        */
+                       public Calendar getNextAvailable() {
+                               return nextAvailable;
+                       }
+
+                       /**
+                        * @return the unit
+                        */
+                       public String getUnit() {
+                               return unit;
+                       }
+
+                       /**
+                        * @return the verb
+                        */
+                       public String getVerb() {
+                               return verb;
+                       }
+
+                       /**
+                        * @return the remaining
+                        */
+                       public Integer getRemaining() {
+                               return remaining;
+                       }
+
+                       /**
+                        * @return the available
+                        */
+                       public Integer getAvailable() {
+                               return available;
+                       }
+
+                       /**
+                        * @return the value
+                        */
+                       public Integer getValue() {
+                               return value;
+                       }
+
+                       /*
+                        * (non-Javadoc)
+                        * 
+                        * @see java.lang.Object#toString()
+                        */
+                       @Override
+                       public String toString() {
+                               return "LimitEntry [nextAvailable=" + nextAvailable + ", unit="
+                                               + unit + ", verb=" + verb + ", remaining=" + remaining
+                                               + ", available=" + available + ", value=" + value + "]";
+                       }
+
+               }
+
+               private String regex;
+
+               private String uri;
+
+               private List<LimitEntry> limit;
+
+               /**
+                * @return the regex
+                */
+               public String getRegex() {
+                       return regex;
+               }
+
+               /**
+                * @return the uri
+                */
+               public String getUri() {
+                       return uri;
+               }
+
+               /**
+                * @return the limit
+                */
+               public List<LimitEntry> getLimit() {
+                       return limit;
+               }
+
+               /*
+                * (non-Javadoc)
+                * 
+                * @see java.lang.Object#toString()
+                */
+               @Override
+               public String toString() {
+                       return "RateLimit [regex=" + regex + ", uri=" + uri + ", limit="
+                                       + limit + "]";
+               }
+
+       }
+
+       public static final class AbsoluteLimit {
+
+               private Integer maxServerMeta;
+               private Integer serverMetaUsed;
+
+               private Integer maxPersonality;
+               private Integer personalityUsed;
+
+               private Integer maxImageMeta;
+               private Integer imageMetaUsed;
+
+               private Integer maxPersonalitySize;
+               private Integer personalitySizeUsed;
+
+               private Integer maxTotalCores;
+               private Integer totalCoresUsed;
+
+               private Integer maxTotalInstances;
+               private Integer totalInstancesUsed;
+
+               private Integer maxTotalRAMSize;
+               private Integer totalRAMUsed;
+
+               private Integer maxSecurityGroupRules;
+               private Integer securityGroupRulesUsed;
+
+               private Integer maxTotalKeypairs;
+               private Integer totalKeyPairsUsed;
+
+               private Integer maxTotalVolumes;
+               private Integer totalVolumesUsed;
+
+               private Integer maxSecurityGroups;
+               private Integer totalSecurityGroupsUsed;
+
+               private Integer maxTotalFloatingIps;
+               private Integer totalFloatingIpsUsed;
+
+               private Integer maxTotalVolumeGigabytes;
+               private Integer totalVolumeGigabytesUsed;
+
+               /**
+                * @return the maxServerMeta
+                */
+               public Integer getMaxServerMeta() {
+                       return maxServerMeta;
+               }
+
+               /**
+                * @return the maxPersonality
+                */
+               public Integer getMaxPersonality() {
+                       return maxPersonality;
+               }
+
+               /**
+                * @return the maxImageMeta
+                */
+               public Integer getMaxImageMeta() {
+                       return maxImageMeta;
+               }
+
+               /**
+                * @return the maxPersonalitySize
+                */
+               public Integer getMaxPersonalitySize() {
+                       return maxPersonalitySize;
+               }
+
+               /**
+                * @return the maxTotalCores
+                */
+               public Integer getMaxTotalCores() {
+                       return maxTotalCores;
+               }
+
+               /**
+                * @return the maxTotalInstances
+                */
+               public Integer getMaxTotalInstances() {
+                       return maxTotalInstances;
+               }
+
+               /**
+                * @return the maxTotalRAMSize
+                */
+               public Integer getMaxTotalRAMSize() {
+                       return maxTotalRAMSize;
+               }
+
+               /**
+                * @return the totalVolumesUsed
+                */
+               public Integer getTotalVolumesUsed() {
+                       return totalVolumesUsed;
+               }
+
+               /**
+                * @return the maxSecurityGroupRules
+                */
+               public Integer getMaxSecurityGroupRules() {
+                       return maxSecurityGroupRules;
+               }
+               
+               /**
+                * @return the maxTotalKeypairs
+                */
+               public Integer getMaxTotalKeypairs() {
+                       return maxTotalKeypairs;
+               }
+
+               /**
+                * @return the totalCoresUsed
+                */
+               public Integer getTotalCoresUsed() {
+                       return totalCoresUsed;
+               }
+
+               /**
+                * @return the maxTotalVolumes
+                */
+               public Integer getMaxTotalVolumes() {
+                       return maxTotalVolumes;
+               }
+
+               /**
+                * @return the totalRAMUsed
+                */
+               public Integer getTotalRAMUsed() {
+                       return totalRAMUsed;
+               }
+
+               /**
+                * @return the totalInstancesUsed
+                */
+               public Integer getTotalInstancesUsed() {
+                       return totalInstancesUsed;
+               }
+
+               /**
+                * @return the maxSecurityGroups
+                */
+               public Integer getMaxSecurityGroups() {
+                       return maxSecurityGroups;
+               }
+               
+               /**
+                * @return the totalVolumeGigabytesUsed
+                */
+               public Integer getTotalVolumeGigabytesUsed() {
+                       return totalVolumeGigabytesUsed;
+               }
+
+               /**
+                * @return the totalSecurityGroupsUsed
+                */
+               public Integer getTotalSecurityGroupsUsed() {
+                       return totalSecurityGroupsUsed;
+               }
+
+               /**
+                * @return the maxTotalFloatingIps
+                */
+               public Integer getMaxTotalFloatingIps() {
+                       return maxTotalFloatingIps;
+               }
+
+               /**
+                * @return the totalKeyPairsUsed
+                */
+               public Integer getTotalKeyPairsUsed() {
+                       return totalKeyPairsUsed;
+               }
+
+               /**
+                * @return the maxTotalVolumeGigabytes
+                */
+               public Integer getMaxTotalVolumeGigabytes() {
+                       return maxTotalVolumeGigabytes;
+               }
+
+               /**
+                * @return the serverMetaUsed
+                */
+               public Integer getServerMetaUsed() {
+                       return serverMetaUsed;
+               }
+
+               /**
+                * @return the personalityUsed
+                */
+               public Integer getPersonalityUsed() {
+                       return personalityUsed;
+               }
+
+               /**
+                * @return the imageMetaUsed
+                */
+               public Integer getImageMetaUsed() {
+                       return imageMetaUsed;
+               }
+
+               /**
+                * @return the personalitySizeUsed
+                */
+               public Integer getPersonalitySizeUsed() {
+                       return personalitySizeUsed;
+               }
+
+               /**
+                * @return the securityGroupRulesUsed
+                */
+               public Integer getSecurityGroupRulesUsed() {
+                       return securityGroupRulesUsed;
+               }
+
+               /**
+                * @return the totalFloatingIpsUsed
+                */
+               public Integer getTotalFloatingIpsUsed() {
+                       return totalFloatingIpsUsed;
+               }
+
+               /*
+                * (non-Javadoc)
+                * 
+                * @see java.lang.Object#toString()
+                */
+               @Override
+               public String toString() {
+                       return "AbsoluteLimit [maxServerMeta=" + maxServerMeta
+                                       + ", maxPersonality=" + maxPersonality + ", maxImageMeta="
+                                       + maxImageMeta + ", maxPersonalitySize="
+                                       + maxPersonalitySize + ", maxTotalCores=" + maxTotalCores
+                                       + ", maxTotalInstances=" + maxTotalInstances
+                                       + ", maxTotalRAMSize=" + maxTotalRAMSize + "]";
+               }
+
+       }
+
+       private List<RateLimit> rate;
+
+       private AbsoluteLimit absolute;
+
+       /**
+        * @return the rate
+        */
+       public List<RateLimit> getRate() {
+               return rate;
+       }
+
+       /**
+        * @return the absolute
+        */
+       public AbsoluteLimit getAbsolute() {
+               return absolute;
+       }
+
+       /*
+        * (non-Javadoc)
+        * 
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Limits [rate=" + rate + ", absolute=" + absolute + "]";
+       }
+
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/Link.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/Link.java
new file mode 100644 (file)
index 0000000..f973bec
--- /dev/null
@@ -0,0 +1,42 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+
+public class Link implements Serializable {
+
+       private String rel;
+       
+       private String href;
+       
+       private String type;
+
+       /**
+        * @return the rel
+        */
+       public String getRel() {
+               return rel;
+       }
+
+       /**
+        * @return the href
+        */
+       public String getHref() {
+               return href;
+       }
+
+       /**
+        * @return the type
+        */
+       public String getType() {
+               return type;
+       }
+
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Link [rel=" + rel + ", href=" + href + ", type=" + type + "]";
+       }
+       
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/Metadata.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/Metadata.java
new file mode 100644 (file)
index 0000000..a3dbffb
--- /dev/null
@@ -0,0 +1,26 @@
+package com.woorea.openstack.nova.model;
+
+import java.util.Map;
+
+public class Metadata {
+
+       private Map<String, String> metadata;
+
+       /**
+        * @return the metadata
+        */
+       public Map<String, String> getMetadata() {
+               return metadata;
+       }
+
+       /**
+        * Set the metadata
+        * @param metadata
+        */
+       public void setMetadata(Map<String, String> metadata) {
+               this.metadata = metadata;
+       }
+       
+
+       
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/Network.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/Network.java
new file mode 100644 (file)
index 0000000..6e82c1d
--- /dev/null
@@ -0,0 +1,290 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("network")
+public class Network implements Serializable {
+
+       private String id;
+       
+       @JsonProperty("vpn_public_address")
+       private String vpnPublicAddress;
+       
+       @JsonProperty("vpn_private_address")
+       private String vpnPrivateAddress;
+       
+       @JsonProperty("vpn_public_port")
+       private String vpnPublicPort;
+       
+       @JsonProperty("dhcp_start")
+       private String dhcpStart;
+       
+       private String bridge;
+       
+       @JsonProperty("bridge_interface")
+       private String bridgeInterface;
+       
+       @JsonProperty("updated_at")
+       private String updatedAt;
+
+       private Boolean deleted;
+       
+       private String vlan;
+       
+       private String broadcast;
+       
+       private String netmask;
+       
+       private Boolean injected;
+       
+       private String host;
+       
+       @JsonProperty("multi_host")
+       private Boolean multiHost;
+       
+       @JsonProperty("created_at")
+       private String createdAt;
+       
+       @JsonProperty("deleted_at")
+       private String deletedAt;
+       
+       private String cidr;
+       
+       @JsonProperty("cidr_v6")
+       private String cidrV6;
+       
+       private String gateway;
+       
+       @JsonProperty("gateway_v6")
+       private String gatewayV6;
+       
+       @JsonProperty("netmask_v6")
+       private String netmaskV6;
+       
+       @JsonProperty("project_id")
+       private String projectId;
+       
+       @JsonProperty("rxtx_base")
+       private String rxtxBase;
+       
+       private String dns1;
+       
+       private String dns2;
+       
+       private String label;
+       
+       private String priority;
+
+       /**
+        * @return the id
+        */
+       public String getId() {
+               return id;
+       }
+
+       /**
+        * @return the vpnPublicAddress
+        */
+       public String getVpnPublicAddress() {
+               return vpnPublicAddress;
+       }
+
+       /**
+        * @return the vpnPublicPort
+        */
+       public String getVpnPublicPort() {
+               return vpnPublicPort;
+       }
+
+       /**
+        * @return the dhcpStart
+        */
+       public String getDhcpStart() {
+               return dhcpStart;
+       }
+
+       /**
+        * @return the bridge
+        */
+       public String getBridge() {
+               return bridge;
+       }
+
+       /**
+        * @return the bridgeInterface
+        */
+       public String getBridgeInterface() {
+               return bridgeInterface;
+       }
+
+       /**
+        * @return the updatedAt
+        */
+       public String getUpdatedAt() {
+               return updatedAt;
+       }
+
+       /**
+        * @return the deleted
+        */
+       public Boolean getDeleted() {
+               return deleted;
+       }
+
+       /**
+        * @return the vlan
+        */
+       public String getVlan() {
+               return vlan;
+       }
+
+       /**
+        * @return the broadcast
+        */
+       public String getBroadcast() {
+               return broadcast;
+       }
+
+       /**
+        * @return the netmask
+        */
+       public String getNetmask() {
+               return netmask;
+       }
+
+       /**
+        * @return the injected
+        */
+       public Boolean getInjected() {
+               return injected;
+       }
+
+       /**
+        * @return the host
+        */
+       public String getHost() {
+               return host;
+       }
+
+       /**
+        * @return the multiHost
+        */
+       public Boolean getMultiHost() {
+               return multiHost;
+       }
+
+       /**
+        * @return the createdAt
+        */
+       public String getCreatedAt() {
+               return createdAt;
+       }
+
+       /**
+        * @return the deletedAt
+        */
+       public String getDeletedAt() {
+               return deletedAt;
+       }
+
+       /**
+        * @return the cidr
+        */
+       public String getCidr() {
+               return cidr;
+       }
+
+       /**
+        * @return the cidrV6
+        */
+       public String getCidrV6() {
+               return cidrV6;
+       }
+
+       /**
+        * @return the gateway
+        */
+       public String getGateway() {
+               return gateway;
+       }
+
+       /**
+        * @return the gatewayV6
+        */
+       public String getGatewayV6() {
+               return gatewayV6;
+       }
+
+       /**
+        * @return the netmaskV6
+        */
+       public String getNetmaskV6() {
+               return netmaskV6;
+       }
+
+       /**
+        * @return the projectId
+        */
+       public String getProjectId() {
+               return projectId;
+       }
+
+       /**
+        * @return the rxtxBase
+        */
+       public String getRxtxBase() {
+               return rxtxBase;
+       }
+
+       /**
+        * @return the dns1
+        */
+       public String getDns1() {
+               return dns1;
+       }
+
+       /**
+        * @return the dns2
+        */
+       public String getDns2() {
+               return dns2;
+       }
+
+       /**
+        * @return the label
+        */
+       public String getLabel() {
+               return label;
+       }
+
+       /**
+        * @return the priority
+        */
+       public String getPriority() {
+               return priority;
+       }
+
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Network [id=" + id + ", vpnPublicAddress=" + vpnPublicAddress
+                               + ", vpnPublicPort=" + vpnPublicPort + ", dhcpStart="
+                               + dhcpStart + ", bridge=" + bridge + ", bridgeInterface="
+                               + bridgeInterface + ", updatedAt=" + updatedAt + ", deleted="
+                               + deleted + ", vlan=" + vlan + ", broadcast=" + broadcast
+                               + ", netmask=" + netmask + ", injected=" + injected + ", host="
+                               + host + ", multiHost=" + multiHost + ", createdAt="
+                               + createdAt + ", deletedAt=" + deletedAt + ", cidr=" + cidr
+                               + ", cidrV6=" + cidrV6 + ", gateway=" + gateway
+                               + ", gatewayV6=" + gatewayV6 + ", netmaskV6=" + netmaskV6
+                               + ", projectId=" + projectId + ", rxtxBase=" + rxtxBase
+                               + ", dns1=" + dns1 + ", dns2=" + dns2 + ", label=" + label
+                               + ", priority=" + priority + "]";
+       }
+       
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/NetworkForCreate.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/NetworkForCreate.java
new file mode 100644 (file)
index 0000000..f578539
--- /dev/null
@@ -0,0 +1,29 @@
+package com.woorea.openstack.nova.model;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+public class NetworkForCreate {
+
+       @JsonProperty("uuid")
+       private String id;
+       @JsonProperty("fixed_ip")
+       private String fixedIp;
+
+       public String getId() {
+               return id;
+       }
+
+       public String getFixedIp() {
+               return fixedIp;
+       }
+
+       public void setId(String id) {
+               this.id = id;
+       }
+
+       public void setFixedIp(String fixedIp) {
+               this.fixedIp = fixedIp;
+       }
+
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/Networks.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/Networks.java
new file mode 100644 (file)
index 0000000..6e8a941
--- /dev/null
@@ -0,0 +1,34 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class Networks implements Iterable<Network>, Serializable {
+
+       @JsonProperty("networks")
+       private List<Network> list;
+
+       /**
+        * @return the list
+        */
+       public List<Network> getList() {
+               return list;
+       }
+       
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Servers [list=" + list + "]";
+       }
+
+       @Override
+       public Iterator<Network> iterator() {
+               return list.iterator();
+       }
+       
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/PersonalityFile.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/PersonalityFile.java
new file mode 100644 (file)
index 0000000..c4ff307
--- /dev/null
@@ -0,0 +1,39 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+
+public final class PersonalityFile implements Serializable {
+       
+       private String path;
+       
+       private String contents;
+
+       /**
+        * @return the path
+        */
+       public String getPath() {
+               return path;
+       }
+
+       /**
+        * @param path the path to set
+        */
+       public void setPath(String path) {
+               this.path = path;
+       }
+
+       /**
+        * @return the contents
+        */
+       public String getContents() {
+               return contents;
+       }
+
+       /**
+        * @param contents the contents to set
+        */
+       public void setContents(String contents) {
+               this.contents = contents;
+       }
+       
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/QuotaSet.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/QuotaSet.java
new file mode 100644 (file)
index 0000000..0a2f55d
--- /dev/null
@@ -0,0 +1,156 @@
+package com.woorea.openstack.nova.model;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("quota_set")
+public class QuotaSet {
+
+       private String id;
+       
+       @JsonProperty("metadata_items")
+       private Integer metadataItems;
+       
+       @JsonProperty("injected_file_content_bytes")
+       private Integer injectedFileContentBytes;
+       
+       @JsonProperty("injected_files")
+       private Integer injectedFiles;
+       
+       private Integer gigabytes;
+       
+       private Integer ram;
+       
+       @JsonProperty("floating_ips")
+       private Integer floatingIps;
+       
+       private Integer instances;
+       
+       private Integer volumes;
+       
+       private Integer cores;
+       
+       @JsonProperty("security_groups")
+       private Integer securityGroups;
+       
+       @JsonProperty("security_group_rules")
+       private Integer securityGroupRules;
+
+       @JsonProperty("injected_file_path_bytes")
+       private Integer injectedFilePathBytes;
+
+       @JsonProperty("key_pairs")
+       private Integer keyPairs;
+
+       public String getId() {
+               return id;
+       }
+
+       public void setId(String id) {
+               this.id = id;
+       }
+
+       public Integer getMetadataItems() {
+               return metadataItems;
+       }
+
+       public void setMetadataItems(Integer metadataItems) {
+               this.metadataItems = metadataItems;
+       }
+
+       public Integer getInjectedFileContentBytes() {
+               return injectedFileContentBytes;
+       }
+
+       public void setInjectedFileContentBytes(Integer injectedFileContentBytes) {
+               this.injectedFileContentBytes = injectedFileContentBytes;
+       }
+
+       public Integer getInjectedFiles() {
+               return injectedFiles;
+       }
+
+       public void setInjectedFiles(Integer injectedFiles) {
+               this.injectedFiles = injectedFiles;
+       }
+
+       public Integer getGigabytes() {
+               return gigabytes;
+       }
+
+       public void setGigabytes(Integer gigabytes) {
+               this.gigabytes = gigabytes;
+       }
+
+       public Integer getRam() {
+               return ram;
+       }
+
+       public void setRam(Integer ram) {
+               this.ram = ram;
+       }
+
+       public Integer getFloatingIps() {
+               return floatingIps;
+       }
+
+       public void setFloatingIps(Integer floatingIps) {
+               this.floatingIps = floatingIps;
+       }
+
+       public Integer getInstances() {
+               return instances;
+       }
+
+       public void setInstances(Integer instances) {
+               this.instances = instances;
+       }
+
+       public Integer getVolumes() {
+               return volumes;
+       }
+
+       public void setVolumes(Integer volumes) {
+               this.volumes = volumes;
+       }
+
+       public Integer getCores() {
+               return cores;
+       }
+
+       public void setCores(Integer cores) {
+               this.cores = cores;
+       }
+
+       public Integer getSecurityGroups() {
+               return securityGroups;
+       }
+
+       public void setSecurityGroups(Integer securityGroups) {
+               this.securityGroups = securityGroups;
+       }
+
+       public Integer getSecurityGroupRules() {
+               return securityGroupRules;
+       }
+
+       public void setSecurityGroupRules(Integer securityGroupRules) {
+               this.securityGroupRules = securityGroupRules;
+       }
+
+       public Integer getKeyPairs() {
+               return keyPairs;
+       }
+
+       public void setKeyPairs(Integer keyPairs) {
+               this.keyPairs = keyPairs;
+       }
+
+       public Integer getInjectedFilePathBytes() {
+               return injectedFilePathBytes;
+       }
+
+       public void setInjectedFilePathBytes(Integer injectedFilePathBytes) {
+               this.injectedFilePathBytes = injectedFilePathBytes;
+       }
+}
\ No newline at end of file
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/SecurityGroup.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/SecurityGroup.java
new file mode 100644 (file)
index 0000000..1b8917b
--- /dev/null
@@ -0,0 +1,207 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("security_group")
+public class SecurityGroup implements Serializable {
+       
+       @JsonRootName("security_group_rule")
+       public static final class Rule implements Serializable {
+       
+           public static final class Group implements Serializable {
+
+               private String name;
+
+               @JsonProperty("tenant_id")
+               private String tenantId;
+
+               public String getName() {
+                   return name;
+               }
+               
+               public String getTenantId() {
+                   return tenantId;
+               }
+
+               @Override
+               public String toString() {
+                   return "Group [name=" + name + ", tenantId=" + tenantId + "]";
+               }
+
+           }
+
+           public static final class IpRange implements Serializable {
+
+               private String cidr;
+
+               public String getCidr() {
+                   return cidr;
+               }
+
+               @Override
+               public String toString() {
+                   return "IpRange [cidr=" + cidr + "]";
+               }
+
+           }
+
+           private String id;
+
+           private String name;
+
+           @JsonProperty("parent_group_id")
+           private String parentGroupId;
+
+           @JsonProperty("from_port")
+           private Integer fromPort;
+
+           @JsonProperty("to_port")
+           private Integer toPort;
+
+           @JsonProperty("ip_protocol")
+           private String ipProtocol;
+
+           @JsonProperty("ip_range")
+           private IpRange ipRange = new IpRange();
+
+           private Group group;
+
+               /**
+                * @return the id
+                */
+               public String getId() {
+                       return id;
+               }
+
+               /**
+                * @return the name
+                */
+               public String getName() {
+                       return name;
+               }
+
+               /**
+                * @return the parentGroupId
+                */
+               public String getParentGroupId() {
+                       return parentGroupId;
+               }
+
+               /**
+                * @return the fromPort
+                */
+               public Integer getFromPort() {
+                       return fromPort;
+               }
+
+               /**
+                * @return the toPort
+                */
+               public Integer getToPort() {
+                       return toPort;
+               }
+
+               /**
+                * @return the ipProtocol
+                */
+               public String getIpProtocol() {
+                       return ipProtocol;
+               }
+
+               /**
+                * @return the ipRange
+                */
+               public IpRange getIpRange() {
+                       return ipRange;
+               }
+
+               /**
+                * @return the group
+                */
+               public Group getGroup() {
+                       return group;
+               }
+
+               /* (non-Javadoc)
+                * @see java.lang.Object#toString()
+                */
+               @Override
+               public String toString() {
+                       return "Rule [id=" + id + ", name=" + name + ", parentGroupId="
+                                       + parentGroupId + ", fromPort=" + fromPort + ", toPort="
+                                       + toPort + ", ipProtocol=" + ipProtocol + ", ipRange="
+                                       + ipRange + ", group=" + group + "]";
+               }
+               
+       }
+
+       private String id;
+       
+       private String name;
+       
+       private String description;
+       
+       @JsonProperty("tenant_id")
+       private String tenantId;
+       
+       private List<Rule> rules;
+       
+       private List<Link> links;
+
+       /**
+        * @return the id
+        */
+       public String getId() {
+               return id;
+       }
+
+       /**
+        * @return the name
+        */
+       public String getName() {
+               return name;
+       }
+
+       /**
+        * @return the description
+        */
+       public String getDescription() {
+               return description;
+       }
+
+       /**
+        * @return the tenantId
+        */
+       public String getTenantId() {
+               return tenantId;
+       }
+
+       /**
+        * @return the rules
+        */
+       public List<Rule> getRules() {
+               return rules;
+       }
+
+       /**
+        * @return the links
+        */
+       public List<Link> getLinks() {
+               return links;
+       }
+
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "SecurityGroup [id=" + id + ", name=" + name + ", description="
+                               + description + ", tenantId=" + tenantId + ", rules=" + rules
+                               + ", links=" + links + "]";
+       }
+       
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/SecurityGroupForCreate.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/SecurityGroupForCreate.java
new file mode 100644 (file)
index 0000000..c3993bb
--- /dev/null
@@ -0,0 +1,64 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("security_group")
+public class SecurityGroupForCreate implements Serializable {
+       
+       private String name;
+       
+       private String description;
+
+       public SecurityGroupForCreate() {
+               super();
+       }
+       
+       public SecurityGroupForCreate(String name) {
+               this.name = name;
+       }
+
+       public SecurityGroupForCreate(String name, String description) {
+               this(name);
+               this.description = description;
+       }
+
+       /**
+        * @return the name
+        */
+       public String getName() {
+               return name;
+       }
+
+       /**
+        * @param name the name to set
+        */
+       public void setName(String name) {
+               this.name = name;
+       }
+
+       /**
+        * @return the description
+        */
+       public String getDescription() {
+               return description;
+       }
+
+       /**
+        * @param description the description to set
+        */
+       public void setDescription(String description) {
+               this.description = description;
+       }
+
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "SecurityGroupForCreate [name=" + name + ", description="
+                               + description + "]";
+       }
+       
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/SecurityGroupRuleForCreate.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/SecurityGroupRuleForCreate.java
new file mode 100644 (file)
index 0000000..2f58da0
--- /dev/null
@@ -0,0 +1,198 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+
+import javax.xml.bind.annotation.XmlElement;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("security_group_rule")
+public class SecurityGroupRuleForCreate implements Serializable {
+
+       @JsonProperty("parent_group_id")
+       private String parentGroupId;
+       
+       @JsonProperty("ip_protocol")
+       private String ipProtocol;
+
+       @JsonProperty("from_port")
+       private Integer fromPort;
+
+       @JsonProperty("to_port")
+       private Integer toPort;
+       
+       @XmlElement
+       private String cidr;
+
+       @JsonProperty("group_id")
+       private String groupId;
+       
+       public SecurityGroupRuleForCreate() {
+               
+       }
+       
+       /**
+        * 
+        * @param parentSecurityGroupId
+        * @param ipProtocol
+        * @param fromPort
+        * @param toPort
+        * @param cidr
+        * @deprecated Ids in some installs have shown to use strings .Use {@link #SecurityGroupRuleForCreate(String, String, Integer, Integer, String)}
+        */
+       @Deprecated
+       public SecurityGroupRuleForCreate(Integer parentSecurityGroupId, String ipProtocol, Integer fromPort,Integer toPort, String cidr) {
+               this.parentGroupId = String.valueOf(parentSecurityGroupId);
+               this.ipProtocol = ipProtocol;
+               this.fromPort = fromPort;
+               this.toPort = toPort;
+               this.cidr = cidr;
+       }
+       /**
+        * 
+        * @param parentSecurityGroupId
+        * @param ipProtocol
+        * @param fromPort
+        * @param toPort
+        * @param cidr
+        * @deprecated Ids in some installs have shown to use strings .Use {@link #SecurityGroupRuleForCreate(String, String, String, Integer, Integer)}
+        */
+       @Deprecated
+       public SecurityGroupRuleForCreate(Integer parentGroupId, String ipProtocol, Integer fromPort,Integer toPort, Integer sourceGroupId) {
+               this.parentGroupId = String.valueOf(parentGroupId);
+               this.ipProtocol = ipProtocol;
+               this.fromPort = fromPort;
+               this.toPort = toPort;
+               this.groupId = String.valueOf(sourceGroupId);
+       }
+       
+       public SecurityGroupRuleForCreate(String parentSecurityGroupId, String ipProtocol, Integer fromPort,Integer toPort, String cidr) {
+               this.parentGroupId = parentSecurityGroupId;
+               this.ipProtocol = ipProtocol;
+               this.fromPort = fromPort;
+               this.toPort = toPort;
+               this.cidr = cidr;
+       }
+       
+       public SecurityGroupRuleForCreate(String parentGroupId, String sourceGroupId, String ipProtocol, Integer fromPort,Integer toPort) {
+               this.parentGroupId = parentGroupId;
+               this.ipProtocol = ipProtocol;
+               this.fromPort = fromPort;
+               this.toPort = toPort;
+               this.groupId = sourceGroupId;
+       }
+
+       /**
+        * @return the parentGroupId
+        */
+       public String getParentGroupId() {
+               return parentGroupId;
+       }
+       
+       
+       /**
+        * @param parentGroupId the parentGroupId to set
+        * @deprecated Use {@link #setParentGroupId(String)}
+        */
+       public void setParentGroupId(Integer parentGroupId) {
+               this.parentGroupId = String.valueOf(parentGroupId);
+       }
+       
+       /**
+        * @param parentGroupId the parentGroupId to set
+        */
+       public void setParentGroupId(String parentGroupId) {
+               this.parentGroupId = parentGroupId;
+       }
+
+       /**
+        * @return the fromPort
+        */
+       public Integer getFromPort() {
+               return fromPort;
+       }
+
+       /**
+        * @param fromPort the fromPort to set
+        */
+       public void setFromPort(Integer fromPort) {
+               this.fromPort = fromPort;
+       }
+
+       /**
+        * @return the toPort
+        */
+       public Integer getToPort() {
+               return toPort;
+       }
+
+       /**
+        * @param toPort the toPort to set
+        */
+       public void setToPort(Integer toPort) {
+               this.toPort = toPort;
+       }
+
+       /**
+        * @return the ipProtocol
+        */
+       public String getIpProtocol() {
+               return ipProtocol;
+       }
+
+       /**
+        * @param ipProtocol the ipProtocol to set
+        */
+       public void setIpProtocol(String ipProtocol) {
+               this.ipProtocol = ipProtocol;
+       }
+
+       /**
+        * @return the cidr
+        */
+       public String getCidr() {
+               return cidr;
+       }
+
+       /**
+        * @param cidr the cidr to set
+        */
+       public void setCidr(String cidr) {
+               this.cidr = cidr;
+       }
+
+       /**
+        * @return the groupId
+        */
+       public String getGroupId() {
+               return groupId;
+       }
+
+       /**
+        * @param groupId the groupId to set
+        * @deprecated Use {@link #setGroupId(String)}
+        */
+       public void setGroupId(Integer groupId) {
+               this.groupId = String.valueOf(groupId);
+       }
+       
+       /**
+        * @param groupId the groupId to set
+        */
+       public void setGroupId(String groupId) {
+               this.groupId = groupId;
+       }
+
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "SecurityGroupRuleForCreate [parentGroupId=" + parentGroupId
+                               + ", fromPort=" + fromPort + ", toPort=" + toPort
+                               + ", ipProtocol=" + ipProtocol + ", cidr=" + cidr
+                               + ", groupId=" + groupId + "]";
+       }
+
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/SecurityGroups.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/SecurityGroups.java
new file mode 100644 (file)
index 0000000..1c8cc55
--- /dev/null
@@ -0,0 +1,34 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class SecurityGroups implements Iterable<SecurityGroup>, Serializable {
+
+       @JsonProperty("security_groups")
+       private List<SecurityGroup> list;
+
+       /**
+        * @return the list
+        */
+       public List<SecurityGroup> getList() {
+               return list;
+       }
+       
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "SecurityGroups [list=" + list + "]";
+       }
+
+       @Override
+       public Iterator<SecurityGroup> iterator() {
+               return list.iterator();
+       }
+       
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/Server.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/Server.java
new file mode 100644 (file)
index 0000000..589ed54
--- /dev/null
@@ -0,0 +1,514 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+import java.util.Calendar;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.codehaus.jackson.annotate.JsonAnySetter;
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("server")
+public class Server implements Serializable {
+       
+       public static final class Addresses implements Serializable {
+               
+               public static final class Address implements Serializable {
+                       
+                       @JsonProperty("OS-EXT-IPS-MAC:mac_addr")
+                       private String macAddr;
+
+                       private String version;
+                       
+                       private String addr;
+                       
+                       @JsonProperty("OS-EXT-IPS:type")
+                       private String type;
+
+                        /**
+                         * @return the macAddr
+                         */
+                       public String getMacAddr() {
+                               return macAddr;
+                       }
+
+                       /**
+                        * @return the version
+                        */
+                       public String getVersion() {
+                               return version;
+                       }
+
+                       /**
+                        * @return the addr
+                        */
+                       public String getAddr() {
+                               return addr;
+                       }
+                       
+
+                       /**
+                        * @return the type
+                        */
+                       public String getType() {
+                               return type;
+                       }
+
+                       /**
+                        * @param version the version to set
+                        */
+                       public void setVersion(String version) {
+                               this.version = version;
+                       }
+
+                       /**
+                        * @param addr the addr to set
+                        */
+                       public void setAddr(String addr) {
+                               this.addr = addr;
+                       }
+
+                       /**
+                        * @param type the type to set
+                        */
+                       public void setType(String type) {
+                               this.type = type;
+                       }
+
+                       /**
+                        * @param macAddr the mac addr to set
+                        */
+                       public void setMacAddr(String macAddr) {
+                               this.macAddr= macAddr;
+                       }
+               }
+
+               private Map<String, List<Address>> addresses = new HashMap<String, List<Address>>();
+
+               @JsonAnySetter
+               public void add(String key, List<Address> value) {
+                       addresses.put(key, value);
+               }
+               /**
+                * @return the ip address List Map
+                */
+               public Map<String, List<Address>> getAddresses() {
+                       return addresses;
+               }
+
+               /* (non-Javadoc)
+                * @see java.lang.Object#toString()
+                */
+               @Override
+               public String toString() {
+                       return "Addresses List Map [" + addresses + "]";
+               }
+               
+       }
+       
+       public static final class Fault {
+               
+               private Integer code;
+               
+               private String message;
+               
+               private String details;
+               
+               private Calendar created;
+
+               /**
+                * @return the code
+                */
+               public Integer getCode() {
+                       return code;
+               }
+
+               /**
+                * @return the message
+                */
+               public String getMessage() {
+                       return message;
+               }
+
+               /**
+                * @return the details
+                */
+               public String getDetails() {
+                       return details;
+               }
+
+               /**
+                * @return the created
+                */
+               public Calendar getCreated() {
+                       return created;
+               }
+
+               /* (non-Javadoc)
+                * @see java.lang.Object#toString()
+                */
+               @Override
+               public String toString() {
+                       return "Fault [code=" + code + ", message=" + message
+                                       + ", details=" + details + ", created=" + created + "]";
+               }
+               
+               
+       }
+               
+
+       private String id;
+       
+       private String name;
+       
+       private Addresses addresses;
+       
+       private List<Link> links;
+       
+       private Image image;
+       
+       private Flavor flavor;
+       
+       private String accessIPv4;
+       
+       private String accessIPv6;
+       
+       @JsonProperty("config_drive")
+       private String configDrive;
+       
+       private String status;
+       
+       private Integer progress;
+       
+       private Fault fault;
+       
+       @JsonProperty("tenant_id")
+       private String tenantId;
+       
+       @JsonProperty("user_id")
+       private String userId;
+       
+       @JsonProperty("key_name")
+       private String keyName;
+       
+       private String hostId;
+       
+       private String updated;
+       
+       private String created;
+       
+       private Map<String, String> metadata;
+       
+       @JsonProperty("security_groups")
+       private List<SecurityGroup> securityGroups;
+       
+       @JsonProperty("OS-EXT-STS:task_state")
+       private String taskState;
+       
+       @JsonProperty("OS-EXT-STS:power_state")
+       private String powerState;
+       
+       @JsonProperty("OS-EXT-STS:vm_state")
+       private String vmState;
+       
+       @JsonProperty("OS-EXT-SRV-ATTR:host")
+       private String host;
+       
+       @JsonProperty("OS-EXT-SRV-ATTR:instance_name")
+       private String instanceName;
+       
+       @JsonProperty("OS-EXT-SRV-ATTR:hypervisor_hostname")
+       private String hypervisorHostname;
+       
+       @JsonProperty("OS-DCF:diskConfig")
+       private String diskConfig;
+       
+       @JsonProperty("OS-EXT-AZ:availability_zone")
+       private String availabilityZone;
+
+    @JsonProperty("OS-SRV-USG:launched_at")
+    private String launchedAt;
+
+    @JsonProperty("OS-SRV-USG:terminated_at")
+    private String terminatedAt;
+
+    @JsonProperty("os-extended-volumes:volumes_attached")
+    private List<String> osExtendedVolumesAttached;
+       
+       private String uuid;
+       
+       private String adminPass;
+
+       /**
+        * @return the id
+        */
+       public String getId() {
+               return id;
+       }
+
+       /**
+        * @return the name
+        */
+       public String getName() {
+               return name;
+       }
+
+       /**
+        * @return the addresses
+        */
+       public Addresses getAddresses() {
+               return addresses;
+       }
+
+       /**
+        * @return the links
+        */
+       public List<Link> getLinks() {
+               return links;
+       }
+
+       /**
+        * @return the image
+        */
+       public Image getImage() {
+               return image;
+       }
+
+       /**
+        * @param image the image to set
+        */
+       public void setImage(Image image) {
+               this.image = image;
+       }
+
+       /**
+        * @return the flavor
+        */
+       public Flavor getFlavor() {
+               return flavor;
+       }
+       
+       /**
+        * @param flavor the flavor to set
+        */
+       public void setFlavor(Flavor flavor) {
+               this.flavor = flavor;
+       }
+
+       /**
+        * @return the accessIPv4
+        */
+       public String getAccessIPv4() {
+               return accessIPv4;
+       }
+
+       /**
+        * @return the accessIPv6
+        */
+       public String getAccessIPv6() {
+               return accessIPv6;
+       }
+
+       /**
+        * @return the configDrive
+        */
+       public String getConfigDrive() {
+               return configDrive;
+       }
+
+       /**
+        * @return the status
+        */
+       public String getStatus() {
+               return status;
+       }
+
+       /**
+        * @return the progress
+        */
+       public Integer getProgress() {
+               return progress;
+       }
+
+       /**
+        * @return the fault
+        */
+       public Fault getFault() {
+               return fault;
+       }
+
+       /**
+        * @return the tenantId
+        */
+       public String getTenantId() {
+               return tenantId;
+       }
+
+       /**
+        * @return the userId
+        */
+       public String getUserId() {
+               return userId;
+       }
+
+       /**
+        * @return the keyName
+        */
+       public String getKeyName() {
+               return keyName;
+       }
+
+       /**
+        * @return the hostId
+        */
+       public String getHostId() {
+               return hostId;
+       }
+
+       /**
+        * @return the updated
+        */
+       public String getUpdated() {
+               return updated;
+       }
+
+       /**
+        * @return the created
+        */
+       public String getCreated() {
+               return created;
+       }
+
+       /**
+        * @return the metadata
+        */
+       public Map<String, String> getMetadata() {
+               return metadata;
+       }
+
+       /**
+        * @return the securityGroups
+        */
+       public List<SecurityGroup> getSecurityGroups() {
+               return securityGroups;
+       }
+
+       /**
+        * @return the taskState
+        */
+       public String getTaskState() {
+               return taskState;
+       }
+
+       /**
+        * @return the powerState
+        */
+       public String getPowerState() {
+               return powerState;
+       }
+
+       /**
+        * @return the vmState
+        */
+       public String getVmState() {
+               return vmState;
+       }
+
+       /**
+        * @return the host
+        */
+       public String getHost() {
+               return host;
+       }
+
+       /**
+        * @return the instanceName
+        */
+       public String getInstanceName() {
+               return instanceName;
+       }
+
+       /**
+        * @return the hypervisorHostname
+        */
+       public String getHypervisorHostname() {
+               return hypervisorHostname;
+       }
+
+       /**
+        * @return the diskConfig
+        */
+       public String getDiskConfig() {
+               return diskConfig;
+       }
+
+       /**
+        * @return the availabilityZone
+        */
+       public String getAvailabilityZone() {
+               return availabilityZone;
+       }
+
+    /**
+     * @return the launchedAt
+     */
+    public String getLaunchedAt() {
+        return launchedAt;
+    }
+
+    /**
+     * @return the terminatedAt
+     */
+    public String getTerminatedAt() {
+        return terminatedAt;
+    }
+
+    /**
+     * @return the osExtendedVolumesAttached
+     */
+    public List<String> getOsExtendedVolumesAttached() {
+        return osExtendedVolumesAttached;
+    }
+
+    /**
+        * @return the uuid
+        */
+       public String getUuid() {
+               return uuid;
+       }
+
+       /**
+        * @return the adminPass
+        */
+       public String getAdminPass() {
+               return adminPass;
+       }
+
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Server [id=" + id + ", name=" + name + ", addresses="
+                               + addresses + ", links=" + links + ", image=" + image
+                               + ", flavor=" + flavor + ", accessIPv4=" + accessIPv4
+                               + ", accessIPv6=" + accessIPv6 + ", configDrive=" + configDrive
+                               + ", status=" + status + ", progress=" + progress + ", fault="
+                               + fault + ", tenantId=" + tenantId + ", userId=" + userId
+                               + ", keyName=" + keyName + ", hostId=" + hostId + ", updated="
+                               + updated + ", created=" + created + ", metadata=" + metadata
+                               + ", securityGroups=" + securityGroups + ", taskState="
+                               + taskState + ", powerState=" + powerState + ", vmState="
+                               + vmState + ", host=" + host + ", instanceName=" + instanceName
+                               + ", hypervisorHostname=" + hypervisorHostname
+                               + ", diskConfig=" + diskConfig + ", availabilityZone="
+                               + availabilityZone + ", launchedAt=" + launchedAt + ", terminatedAt="
+                + ", " + "osExtendedVolumesAttached=" + osExtendedVolumesAttached
+                + ", uuid=" + uuid + ", adminPass="
+                               + adminPass + "]";
+       }
+
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/ServerAction.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/ServerAction.java
new file mode 100644 (file)
index 0000000..26fa5a4
--- /dev/null
@@ -0,0 +1,610 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+public interface ServerAction extends Serializable {
+       
+       @JsonRootName("changePassword")
+       public static final class ChangePassword implements ServerAction {
+               
+               private String adminPass;
+
+               public ChangePassword() {
+                       super();
+                       // TODO Auto-generated constructor stub
+               }
+
+               public ChangePassword(String adminPass) {
+                       this.adminPass = adminPass;
+               }
+
+               /**
+                * @return the adminPass
+                */
+               public String getAdminPass() {
+                       return adminPass;
+               }
+
+               /**
+                * @param adminPass the adminPass to set
+                */
+               public void setAdminPass(String adminPass) {
+                       this.adminPass = adminPass;
+               }
+       
+       }
+       
+       @JsonRootName("reboot")
+       public static final class Reboot implements ServerAction {
+               
+               private String type;
+
+               /**
+                * @return the type
+                */
+               public String getType() {
+                       return type;
+               }
+
+               /**
+                * @param type the type to set
+                */
+               public void setType(String type) {
+                       this.type = type;
+               }
+               
+       }
+       
+       @JsonRootName("rebuild")
+       public static final class Rebuild implements ServerAction {
+               
+               private String imageRef;
+               
+               private String name;
+               
+               private String adminPass;
+               
+               private String accessIPv4;
+               
+               private String accessIPv6;
+               
+               private Map<String, String> metadata = new HashMap<String, String>();
+               
+               private List<PersonalityFile> personality = new ArrayList<PersonalityFile>();
+               
+               @JsonProperty("OS-DCF:diskConfig")
+               private String diskConfig;
+
+               /**
+                * @return the imageRef
+                */
+               public String getImageRef() {
+                       return imageRef;
+               }
+
+               /**
+                * @param imageRef the imageRef to set
+                */
+               public void setImageRef(String imageRef) {
+                       this.imageRef = imageRef;
+               }
+
+               /**
+                * @return the name
+                */
+               public String getName() {
+                       return name;
+               }
+
+               /**
+                * @param name the name to set
+                */
+               public void setName(String name) {
+                       this.name = name;
+               }
+
+               /**
+                * @return the adminPass
+                */
+               public String getAdminPass() {
+                       return adminPass;
+               }
+
+               /**
+                * @param adminPass the adminPass to set
+                */
+               public void setAdminPass(String adminPass) {
+                       this.adminPass = adminPass;
+               }
+
+               /**
+                * @return the accessIPv4
+                */
+               public String getAccessIPv4() {
+                       return accessIPv4;
+               }
+
+               /**
+                * @param accessIPv4 the accessIPv4 to set
+                */
+               public void setAccessIPv4(String accessIPv4) {
+                       this.accessIPv4 = accessIPv4;
+               }
+
+               /**
+                * @return the accessIPv6
+                */
+               public String getAccessIPv6() {
+                       return accessIPv6;
+               }
+
+               /**
+                * @param accessIPv6 the accessIPv6 to set
+                */
+               public void setAccessIPv6(String accessIPv6) {
+                       this.accessIPv6 = accessIPv6;
+               }
+
+               /**
+                * @return the metadata
+                */
+               public Map<String, String> getMetadata() {
+                       return metadata;
+               }
+
+               /**
+                * @param metadata the metadata to set
+                */
+               public void setMetadata(Map<String, String> metadata) {
+                       this.metadata = metadata;
+               }
+
+               /**
+                * @return the personality
+                */
+               public List<PersonalityFile> getPersonality() {
+                       return personality;
+               }
+
+               /**
+                * @param personality the personality to set
+                */
+               public void setPersonality(List<PersonalityFile> personality) {
+                       this.personality = personality;
+               }
+
+               /**
+                * @return the diskConfig
+                */
+               public String getDiskConfig() {
+                       return diskConfig;
+               }
+
+               /**
+                * @param diskConfig the diskConfig to set
+                */
+               public void setDiskConfig(String diskConfig) {
+                       this.diskConfig = diskConfig;
+               }
+               
+       }
+       
+       @JsonRootName("resize")
+       public static final class Resize implements ServerAction {
+               
+               private String flavorRef;
+               
+               @JsonProperty("OS-DCF:diskConfig")
+               private String diskConfig;
+
+               /**
+                * @return the flavorRef
+                */
+               public String getFlavorRef() {
+                       return flavorRef;
+               }
+
+               /**
+                * @param flavorRef the flavorRef to set
+                */
+               public void setFlavorRef(String flavorRef) {
+                       this.flavorRef = flavorRef;
+               }
+
+               /**
+                * @return the diskConfig
+                */
+               public String getDiskConfig() {
+                       return diskConfig;
+               }
+
+               /**
+                * @param diskConfig the diskConfig to set
+                */
+               public void setDiskConfig(String diskConfig) {
+                       this.diskConfig = diskConfig;
+               }
+               
+       }
+       
+       @JsonRootName("confirmResize")
+       public static final class ConfirmResize implements ServerAction {
+               
+       }
+       
+       @JsonRootName("revertResize")
+       public static final class RevertResize implements ServerAction {
+               
+       }
+       
+       @JsonRootName("createImage")
+       public static final class CreateImage implements ServerAction {
+               
+               private String name;
+               
+               private Map<String, String> metadata;
+
+               /**
+                * @return the name
+                */
+               public String getName() {
+                       return name;
+               }
+
+               /**
+                * @param name the name to set
+                */
+               public void setName(String name) {
+                       this.name = name;
+               }
+
+               /**
+                * @return the metadata
+                */
+               public Map<String, String> getMetadata() {
+                       return metadata;
+               }
+
+               /**
+                * @param metadata the metadata to set
+                */
+               public void setMetadata(Map<String, String> metadata) {
+                       this.metadata = metadata;
+               }
+               
+       }
+       
+       @JsonRootName("rescue")
+       public static final class Rescue implements ServerAction {
+               
+               private String adminPass;
+
+               public Rescue() {
+                       
+               }
+               
+               public Rescue(String adminPass) {
+                       this.adminPass = adminPass;
+               }
+
+               /**
+                * @return the adminPass
+                */
+               public String getAdminPass() {
+                       return adminPass;
+               }
+
+               /**
+                * @param adminPass the adminPass to set
+                */
+               public void setAdminPass(String adminPass) {
+                       this.adminPass = adminPass;
+               }
+               
+       }
+       
+       public static final class RescueResponse implements ServerAction {
+               
+               private String adminPass;
+
+               /**
+                * @return the adminPass
+                */
+               public String getAdminPass() {
+                       return adminPass;
+               }
+               
+       }
+
+       @JsonRootName("unrescue")
+       public static final class Unrescue implements ServerAction {
+               
+       }
+       
+       @JsonRootName("unpause")
+       public static final class Unpause implements ServerAction {
+               
+       }
+
+       @JsonRootName("pause")
+       public static final class Pause implements ServerAction {
+               
+       }
+       
+       @JsonRootName("suspend")
+       public static final class Suspend implements ServerAction {
+               
+       }
+
+       @JsonRootName("resume")
+       public static final class Resume implements ServerAction {
+               
+       }
+       
+       @JsonRootName("lock")
+       public static final class Lock implements ServerAction {
+               
+       }
+
+       @JsonRootName("unlock")
+       public static final class Unlock implements ServerAction {
+               
+       }
+       
+       @JsonRootName("os-getConsoleOutput")
+       public static final class GetConsoleOutput implements ServerAction {
+               
+               private Integer length;
+               
+               public GetConsoleOutput() {
+                       
+               }
+
+               public GetConsoleOutput(Integer length) {
+                       this.length = length;
+               }
+
+               /**
+                * @return the length
+                */
+               public Integer getLength() {
+                       return length;
+               }
+
+               /**
+                * @param length the length to set
+                */
+               public void setLength(Integer length) {
+                       this.length = length;
+               }
+               
+       }
+       
+       public static final class ConsoleOutput implements ServerAction {
+               
+               private String output;
+
+               /**
+                * @return the output
+                */
+               public String getOutput() {
+                       return output;
+               }
+               
+       }
+       
+       @JsonRootName("os-getVNCConsole")
+       public static final class GetVncConsole implements ServerAction {
+               
+               private String type;
+
+               public GetVncConsole() {
+                       super();
+                       // TODO Auto-generated constructor stub
+               }
+               
+
+               public GetVncConsole(String type) {
+                       super();
+                       this.type = type;
+               }
+
+               /**
+                * @return the type
+                */
+               public String getType() {
+                       return type;
+               }
+
+               /**
+                * @param type the type to set
+                */
+               public void setType(String type) {
+                       this.type = type;
+               }
+               
+       }
+       
+       @JsonRootName("console")
+       public static final class VncConsole implements ServerAction {
+               
+               private String type;
+               
+               private String url;
+
+               /**
+                * @return the type
+                */
+               public String getType() {
+                       return type;
+               }
+
+               /**
+                * @return the url
+                */
+               public String getUrl() {
+                       return url;
+               }
+               
+       }
+       
+       @JsonRootName("os-start")
+       public static final class Start implements ServerAction {
+               
+       }
+
+       @JsonRootName("os-stop")
+       public static final class Stop implements ServerAction {
+               
+       }
+       
+       @JsonRootName("forceDelete")
+       public static final class ForceDelete implements ServerAction {
+               
+       }
+
+       @JsonRootName("restore")
+       public static final class Restore implements ServerAction {
+               
+       }
+       
+       @JsonRootName("addFloatingIp")
+       public static final class AssociateFloatingIp implements ServerAction {
+       
+               private String address;
+
+               public AssociateFloatingIp() {
+                       super();
+                       // TODO Auto-generated constructor stub
+               }
+
+               public AssociateFloatingIp(String address) {
+                       super();
+                       this.address = address;
+               }
+
+               /**
+                * @return the address
+                */
+               public String getAddress() {
+                       return address;
+               }
+
+               /**
+                * @param address the address to set
+                */
+               public void setAddress(String address) {
+                       this.address = address;
+               }
+               
+       }
+       
+       @JsonRootName("removeFloatingIp")
+       public static final class DisassociateFloatingIp implements ServerAction {
+               
+               private String address;
+               
+               public DisassociateFloatingIp() {
+                       super();
+                       // TODO Auto-generated constructor stub
+               }
+
+               public DisassociateFloatingIp(String address) {
+                       super();
+                       this.address = address;
+               }
+
+               /**
+                * @return the address
+                */
+               public String getAddress() {
+                       return address;
+               }
+
+               /**
+                * @param address the address to set
+                */
+               public void setAddress(String address) {
+                       this.address = address;
+               }
+               
+       }
+       
+       @JsonRootName("createBackup")
+       public static final class CreateBackup implements ServerAction {
+               
+               private String name;
+
+               @JsonProperty("backup_type")
+               private String type;
+
+               private String rotation;
+
+               private Map<String, String> metadata;
+
+               /**
+                * @return the name
+                */
+               public String getName() {
+                       return name;
+               }
+
+               /**
+                * @param name the name to set
+                */
+               public void setName(String name) {
+                       this.name = name;
+               }
+
+               /**
+                * @return the type
+                */
+               public String getType() {
+                       return type;
+               }
+
+               /**
+                * @param type the type to set
+                */
+               public void setType(String type) {
+                       this.type = type;
+               }
+
+               /**
+                * @return the rotation
+                */
+               public String getRotation() {
+                       return rotation;
+               }
+
+               /**
+                * @param rotation the rotation to set
+                */
+               public void setRotation(String rotation) {
+                       this.rotation = rotation;
+               }
+
+               /**
+                * @return the metadata
+                */
+               public Map<String, String> getMetadata() {
+                       return metadata;
+               }
+
+               /**
+                * @param metadata the metadata to set
+                */
+               public void setMetadata(Map<String, String> metadata) {
+                       this.metadata = metadata;
+               }
+               
+       }
+       
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/ServerForCreate.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/ServerForCreate.java
new file mode 100644 (file)
index 0000000..9f28a81
--- /dev/null
@@ -0,0 +1,326 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("server")
+public class ServerForCreate implements Serializable {
+
+       public static final class SecurityGroup implements Serializable {
+
+               private String name;
+
+               public SecurityGroup() {
+               }
+
+               public SecurityGroup(String name) {
+                       this.name = name;
+               }
+
+               /**
+                * @return the name
+                */
+               public String getName() {
+                       return name;
+               }
+
+               /**
+                * @param name
+                *          the name to set
+                */
+               public void setName(String name) {
+                       this.name = name;
+               }
+
+       }
+
+       private String name;
+
+       private String adminPass;
+
+       private String imageRef;
+
+       private String flavorRef;
+
+       private String accessIPv4;
+
+       private String accessIPv6;
+
+       private Integer min;
+
+       private Integer max;
+
+       private String diskConfig;
+
+       @JsonProperty("key_name")
+       private String keyName;
+
+       private List<PersonalityFile> personality = new ArrayList<PersonalityFile>();
+
+       private Map<String, String> metadata = new HashMap<String, String>();
+
+       @JsonProperty("security_groups")
+       private List<SecurityGroup> securityGroups;
+
+       @JsonProperty("user_data")
+       private String userData;
+
+       @JsonProperty("availability_zone")
+       private String availabilityZone;
+
+       @JsonProperty("config_drive")
+       private boolean configDrive;
+
+       @JsonProperty("networks")
+       private List<NetworkForCreate> networks = new ArrayList<NetworkForCreate>();
+
+       /**
+        * @return the name
+        */
+       public String getName() {
+               return name;
+       }
+
+       /**
+        * @param name
+        *          the name to set
+        */
+       public void setName(String name) {
+               this.name = name;
+       }
+
+       /**
+        * @return the adminPass
+        */
+       public String getAdminPass() {
+               return adminPass;
+       }
+
+       /**
+        * @param adminPass
+        *          the adminPass to set
+        */
+       public void setAdminPass(String adminPass) {
+               this.adminPass = adminPass;
+       }
+
+       /**
+        * @return the imageRef
+        */
+       public String getImageRef() {
+               return imageRef;
+       }
+
+       /**
+        * @param imageRef
+        *          the imageRef to set
+        */
+       public void setImageRef(String imageRef) {
+               this.imageRef = imageRef;
+       }
+
+       /**
+        * @return the flavorRef
+        */
+       public String getFlavorRef() {
+               return flavorRef;
+       }
+
+       /**
+        * @param flavorRef
+        *          the flavorRef to set
+        */
+       public void setFlavorRef(String flavorRef) {
+               this.flavorRef = flavorRef;
+       }
+
+       /**
+        * @return the accessIPv4
+        */
+       public String getAccessIPv4() {
+               return accessIPv4;
+       }
+
+       /**
+        * @param accessIPv4
+        *          the accessIPv4 to set
+        */
+       public void setAccessIPv4(String accessIPv4) {
+               this.accessIPv4 = accessIPv4;
+       }
+
+       /**
+        * @return the accessIPv6
+        */
+       public String getAccessIPv6() {
+               return accessIPv6;
+       }
+
+       /**
+        * @param accessIPv6
+        *          the accessIPv6 to set
+        */
+       public void setAccessIPv6(String accessIPv6) {
+               this.accessIPv6 = accessIPv6;
+       }
+
+       /**
+        * @return the min
+        */
+       public Integer getMin() {
+               return min;
+       }
+
+       /**
+        * @param min
+        *          the min to set
+        */
+       public void setMin(Integer min) {
+               this.min = min;
+       }
+
+       /**
+        * @return the max
+        */
+       public Integer getMax() {
+               return max;
+       }
+
+       /**
+        * @param max
+        *          the max to set
+        */
+       public void setMax(Integer max) {
+               this.max = max;
+       }
+
+       /**
+        * @return the diskConfig
+        */
+       public String getDiskConfig() {
+               return diskConfig;
+       }
+
+       /**
+        * @param diskConfig
+        *          the diskConfig to set
+        */
+       public void setDiskConfig(String diskConfig) {
+               this.diskConfig = diskConfig;
+       }
+
+       /**
+        * @return the keyName
+        */
+       public String getKeyName() {
+               return keyName;
+       }
+
+       /**
+        * @param keyName
+        *          the keyName to set
+        */
+       public void setKeyName(String keyName) {
+               this.keyName = keyName;
+       }
+
+       /**
+        * @return the personality
+        */
+       public List<PersonalityFile> getPersonality() {
+               return personality;
+       }
+
+       /**
+        * @param personality
+        *          the personality to set
+        */
+       public void setPersonality(List<PersonalityFile> personality) {
+               this.personality = personality;
+       }
+
+       /**
+        * @return the metadata
+        */
+       public Map<String, String> getMetadata() {
+               return metadata;
+       }
+
+       /**
+        * @param metadata
+        *          the metadata to set
+        */
+       public void setMetadata(Map<String, String> metadata) {
+               this.metadata = metadata;
+       }
+
+       /**
+        * @return the securityGroups
+        */
+       public List<SecurityGroup> getSecurityGroups() {
+               if (securityGroups == null) {
+                       securityGroups = new ArrayList<SecurityGroup>();
+               }
+               return securityGroups;
+       }
+
+       /**
+        * @return the userData
+        */
+       public String getUserData() {
+               return userData;
+       }
+
+       /**
+        * @param userData
+        *          the userData to set
+        */
+       public void setUserData(String userData) {
+               this.userData = userData;
+       }
+
+       /**
+        * @return the availabilityZone
+        */
+       public String getAvailabilityZone() {
+               return availabilityZone;
+       }
+
+       /**
+        * @param availabilityZone
+        *          the availabilityZone to set
+        */
+       public void setAvailabilityZone(String availabilityZone) {
+               this.availabilityZone = availabilityZone;
+       }
+
+       public boolean isConfigDrive() {
+               return configDrive;
+       }
+
+       public void setConfigDrive(boolean configDrive) {
+               this.configDrive = configDrive;
+       }
+
+       public List<NetworkForCreate> getNetworks() {
+               return networks;
+       }
+
+       public void setNetworks(List<NetworkForCreate> networks) {
+               this.networks = networks;
+       }
+
+       public void addNetworks(String id, String fixedIp) {
+               NetworkForCreate net = new NetworkForCreate();
+               net.setId(id);
+               net.setFixedIp(fixedIp);
+               this.networks.add(net);
+       }
+
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/Servers.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/Servers.java
new file mode 100644 (file)
index 0000000..a144250
--- /dev/null
@@ -0,0 +1,34 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class Servers implements Iterable<Server>, Serializable {
+
+       @JsonProperty("servers")
+       private List<Server> list;
+
+       /**
+        * @return the list
+        */
+       public List<Server> getList() {
+               return list;
+       }
+       
+       @Override
+       public Iterator<Server> iterator() {
+               return list.iterator();
+       }
+       
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Servers [list=" + list + "]";
+       }
+
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/SimpleTenantUsage.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/SimpleTenantUsage.java
new file mode 100644 (file)
index 0000000..f75414d
--- /dev/null
@@ -0,0 +1,232 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("tenant_usage")
+public class SimpleTenantUsage implements Serializable {
+       
+       @JsonProperty("total_memory_mb_usage")
+       private BigDecimal totalMemoryMbUsage;
+       
+       @JsonProperty("total_vcpus_usage")
+       private BigDecimal totalVcpusUsage;
+       
+       @JsonProperty("total_local_gb_usage")
+       private BigDecimal totalLocalGbUsage;
+
+       private String start;
+       
+       private String stop;
+       
+       @JsonProperty("tenant_id")
+       private String tenantId;
+       
+       @JsonProperty("total_hours")
+       private String totalHours;
+
+       @JsonProperty("server_usages")
+       private List<ServerUsage> serverUsages;
+
+       /**
+        * @return the totalMemoryMbUsage
+        */
+       public BigDecimal getTotalMemoryMbUsage() {
+               return totalMemoryMbUsage;
+       }
+
+       /**
+        * @param totalMemoryMbUsage the totalMemoryMbUsage to set
+        */
+       public void setTotalMemoryMbUsage(BigDecimal totalMemoryMbUsage) {
+               this.totalMemoryMbUsage = totalMemoryMbUsage;
+       }
+
+       /**
+        * @return the totalVcpusUsage
+        */
+       public BigDecimal getTotalVcpusUsage() {
+               return totalVcpusUsage;
+       }
+
+       /**
+        * @param totalVcpusUsage the totalVcpusUsage to set
+        */
+       public void setTotalVcpusUsage(BigDecimal totalVcpusUsage) {
+               this.totalVcpusUsage = totalVcpusUsage;
+       }
+
+       /**
+        * @return the totalLocalGbUsage
+        */
+       public BigDecimal getTotalLocalGbUsage() {
+               return totalLocalGbUsage;
+       }
+
+       /**
+        * @param totalLocalGbUsage the totalLocalGbUsage to set
+        */
+       public void setTotalLocalGbUsage(BigDecimal totalLocalGbUsage) {
+               this.totalLocalGbUsage = totalLocalGbUsage;
+       }
+
+       /**
+        * @return the start
+        */
+       public String getStart() {
+               return start;
+       }
+
+       /**
+        * @param start the start to set
+        */
+       public void setStart(String start) {
+               this.start = start;
+       }
+
+       /**
+        * @return the stop
+        */
+       public String getStop() {
+               return stop;
+       }
+
+       /**
+        * @param stop the stop to set
+        */
+       public void setStop(String stop) {
+               this.stop = stop;
+       }
+
+       /**
+        * @return the tenantId
+        */
+       public String getTenantId() {
+               return tenantId;
+       }
+
+       /**
+        * @param tenantId the tenantId to set
+        */
+       public void setTenantId(String tenantId) {
+               this.tenantId = tenantId;
+       }
+
+       /**
+        * @return the totalHours
+        */
+       public String getTotalHours() {
+               return totalHours;
+       }
+
+       /**
+        * @param totalHours the totalHours to set
+        */
+       public void setTotalHours(String totalHours) {
+               this.totalHours = totalHours;
+       }
+
+       public List<ServerUsage> getServerUsages() {
+               return serverUsages;
+       }
+
+       public void setServerUsages(List<ServerUsage> serverUsages) {
+               this.serverUsages = serverUsages;
+       }
+
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "SimpleTenantUsage [totalMemoryMbUsage=" + totalMemoryMbUsage
+                               + ", totalVcpusUsage=" + totalVcpusUsage
+                               + ", totalLocalGbUsage=" + totalLocalGbUsage + ", start="
+                               + start + ", stop=" + stop + ", tenantId=" + tenantId
+                               + ", totalHours=" + totalHours + "]";
+       }
+
+       public static final class ServerUsage implements Serializable {
+               @JsonProperty("instance_id")
+               private String instanceId;
+
+               private Integer uptime;
+
+               @JsonProperty("started_at")
+               private String startedAt;
+       
+               @JsonProperty("ended_at")
+               private String endedAt;
+
+               @JsonProperty("memory_mb")
+               private Integer memoryMb;
+
+               @JsonProperty("tenant_id")
+               private String tenantId;
+
+               private String state;
+
+               private Double hours;
+
+               private Integer vcpus;
+
+               private String flavor;
+
+               @JsonProperty("local_gb")
+               private Integer localDiskSize;
+
+               private String name;
+
+               public String getInstanceId() {
+                       return instanceId;
+               }
+
+               public Integer getUptime() {
+                       return uptime;
+               }
+
+               public String getStartedAt() {
+                       return startedAt;
+               }
+
+               public String getEndedAt() {
+                       return endedAt;
+               }
+
+               public Integer getMemoryMb() {
+                       return memoryMb;
+               }
+
+               public String getTenantId() {
+                       return tenantId;
+               }
+
+               public String getState() {
+                       return state;
+               }
+
+               public Double getHours() {
+                       return hours;
+               }
+
+               public Integer getVcpus() {
+                       return vcpus;
+               }
+
+               public String getFlavor() {
+                       return flavor;
+               }
+
+               public Integer getLocalDiskSize() {
+                       return localDiskSize;
+               }
+
+               public String getName() {
+                       return name;
+               }
+       }
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/SimpleTenantUsages.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/SimpleTenantUsages.java
new file mode 100644 (file)
index 0000000..33c4625
--- /dev/null
@@ -0,0 +1,34 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class SimpleTenantUsages implements Iterable<SimpleTenantUsage>, Serializable {
+
+       @JsonProperty("tenant_usages")
+       private List<SimpleTenantUsage> list;
+
+       /**
+        * @return the list
+        */
+       public List<SimpleTenantUsage> getList() {
+               return list;
+       }
+
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "SimpleTenantUsage [list=" + list + "]";
+       }
+
+       @Override
+       public Iterator<SimpleTenantUsage> iterator() {
+               return list.iterator();
+       }
+       
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/Snapshot.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/Snapshot.java
new file mode 100644 (file)
index 0000000..06b9c4d
--- /dev/null
@@ -0,0 +1,87 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("snapshot")
+public class Snapshot implements Serializable {
+
+       private String id;
+       
+       private String status;
+       
+       @JsonProperty("displayName")
+       private String name;
+       
+       @JsonProperty("displayDescription")
+       private String description;
+       
+       private String volumeId;
+       
+       private Integer size;
+       
+       private String createdAt;
+
+       /**
+        * @return the id
+        */
+       public String getId() {
+               return id;
+       }
+
+       /**
+        * @return the status
+        */
+       public String getStatus() {
+               return status;
+       }
+
+       /**
+        * @return the name
+        */
+       public String getName() {
+               return name;
+       }
+
+       /**
+        * @return the description
+        */
+       public String getDescription() {
+               return description;
+       }
+
+       /**
+        * @return the volumeId
+        */
+       public String getVolumeId() {
+               return volumeId;
+       }
+
+       /**
+        * @return the size
+        */
+       public Integer getSize() {
+               return size;
+       }
+
+       /**
+        * @return the createdAt
+        */
+       public String getCreatedAt() {
+               return createdAt;
+       }
+
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Snapshot [id=" + id + ", status=" + status + ", displayName="
+                               + name + ", displayDescription=" + description
+                               + ", volumeId=" + volumeId + ", size=" + size + ", createdAt="
+                               + createdAt + "]";
+       }
+       
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/SnapshotForCreate.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/SnapshotForCreate.java
new file mode 100644 (file)
index 0000000..5db392e
--- /dev/null
@@ -0,0 +1,87 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("snapshot")
+public class SnapshotForCreate implements Serializable {
+       
+       @JsonProperty("volume_id")
+       private String volumeId;
+       
+       private Boolean force;
+       
+       @JsonProperty("display_name")
+       private String name;
+
+       @JsonProperty("display_description")
+       private String description;
+
+       /**
+        * @return the volumeId
+        */
+       public String getVolumeId() {
+               return volumeId;
+       }
+
+       /**
+        * @param volumeId the volumeId to set
+        */
+       public void setVolumeId(String volumeId) {
+               this.volumeId = volumeId;
+       }
+
+       /**
+        * @return the force
+        */
+       public Boolean getForce() {
+               return force;
+       }
+
+       /**
+        * @param force the force to set
+        */
+       public void setForce(Boolean force) {
+               this.force = force;
+       }
+
+       /**
+        * @return the name
+        */
+       public String getName() {
+               return name;
+       }
+
+       /**
+        * @param name the name to set
+        */
+       public void setName(String name) {
+               this.name = name;
+       }
+
+       /**
+        * @return the description
+        */
+       public String getDescription() {
+               return description;
+       }
+
+       /**
+        * @param description the description to set
+        */
+       public void setDescription(String description) {
+               this.description = description;
+       }
+
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "SnapshotForCreate [volumeId=" + volumeId + ", force=" + force
+                               + ", name=" + name + ", description=" + description + "]";
+       }
+
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/Snapshots.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/Snapshots.java
new file mode 100644 (file)
index 0000000..006d30c
--- /dev/null
@@ -0,0 +1,34 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class Snapshots implements Iterable<Snapshot>, Serializable {
+
+       @JsonProperty("snapshots")
+       private List<Snapshot> list;
+
+       /**
+        * @return the list
+        */
+       public List<Snapshot> getList() {
+               return list;
+       }
+       
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Snapshots [list=" + list + "]";
+       }
+
+       @Override
+       public Iterator<Snapshot> iterator() {
+               return list.iterator();
+       }
+       
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/Volume.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/Volume.java
new file mode 100644 (file)
index 0000000..d4b7e6e
--- /dev/null
@@ -0,0 +1,116 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("volume")
+public class Volume implements Serializable {
+
+       private String id;
+       
+       private String status;
+       
+       @JsonProperty("displayName")
+       private String name;
+       
+       @JsonProperty("displayDescription")
+       private String description;
+       
+       private String availabilityZone;
+
+       private String volumeType;
+       
+       private String snapshotId;
+       
+       private List<Map<String, Object>> attachments;
+       
+       private Map<String, String> metadata;
+       
+       private String createdAt;
+       
+       private Integer size;
+
+       /**
+        * @return the id
+        */
+       public String getId() {
+               return id;
+       }
+
+       /**
+        * @return the status
+        */
+       public String getStatus() {
+               return status;
+       }
+
+       /**
+        * @return the name
+        */
+       public String getName() {
+               return name;
+       }
+
+       /**
+        * @return the description
+        */
+       public String getDescription() {
+               return description;
+       }
+
+       /**
+        * @return the availabilityZone
+        */
+       public String getAvailabilityZone() {
+               return availabilityZone;
+       }
+
+       /**
+        * @return the volumeType
+        */
+       public String getVolumeType() {
+               return volumeType;
+       }
+
+       /**
+        * @return the snapshotId
+        */
+       public String getSnapshotId() {
+               return snapshotId;
+       }
+
+       /**
+        * @return the attachments
+        */
+       public List<Map<String, Object>> getAttachments() {
+               return attachments;
+       }
+
+       /**
+        * @return the metadata
+        */
+       public Map<String, String> getMetadata() {
+               return metadata;
+       }
+
+       /**
+        * @return the createdAt
+        */
+       public String getCreatedAt() {
+               return createdAt;
+       }
+
+       /**
+        * @return the size
+        */
+       public Integer getSize() {
+               return size;
+       }
+
+       
+       
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/VolumeAttachment.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/VolumeAttachment.java
new file mode 100644 (file)
index 0000000..54abc9e
--- /dev/null
@@ -0,0 +1,59 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("volumeAttachment")
+public class VolumeAttachment implements Serializable {
+
+       private String id;
+
+       private String volumeId;
+
+       private String serverId;
+
+       private String device;
+
+       public String getId() {
+               return id;
+       }
+
+       public void setId(String id) {
+               this.id = id;
+       }
+
+       public String getVolumeId() {
+               return volumeId;
+       }
+
+       public void setVolumeId(String volumeId) {
+               this.volumeId = volumeId;
+       }
+
+       public String getServerId() {
+               return serverId;
+       }
+
+       public void setServerId(String serverId) {
+               this.serverId = serverId;
+       }
+
+       public String getDevice() {
+               return device;
+       }
+
+       public void setDevice(String device) {
+               this.device = device;
+       }
+
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "VolumeAttachment [id=" + id + ", volumeId=" + volumeId
+                               + ", serverId=" + serverId + ", device=" + device + "]";
+       }
+
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/VolumeAttachments.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/VolumeAttachments.java
new file mode 100644 (file)
index 0000000..be5ea8e
--- /dev/null
@@ -0,0 +1,34 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class VolumeAttachments implements Iterable<VolumeAttachment>, Serializable {
+
+       @JsonProperty("volumeAttachments")
+       private List<VolumeAttachment> list;
+
+       /**
+        * @return the list
+        */
+       public List<VolumeAttachment> getList() {
+               return list;
+       }
+
+       @Override
+       public Iterator<VolumeAttachment> iterator() {
+               return list.iterator();
+       }
+       
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "VolumeAttachments [list=" + list + "]";
+       }
+
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/VolumeForCreate.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/VolumeForCreate.java
new file mode 100644 (file)
index 0000000..c4a09a3
--- /dev/null
@@ -0,0 +1,123 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+import java.util.Map;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("volume")
+public class VolumeForCreate implements Serializable {
+
+       private Integer size;
+
+       @JsonProperty("availability_zone")
+       private String availabilityZone;
+
+       @JsonProperty("display_name")
+       private String name;
+
+       @JsonProperty("display_description")
+       private String description;
+
+       @JsonProperty("snapshot_id")
+       private Integer snapshotId;
+
+       private Map<String, String> metadata;
+
+       /**
+        * @return the size
+        */
+       public Integer getSize() {
+               return size;
+       }
+
+       /**
+        * @param size the size to set
+        */
+       public void setSize(Integer size) {
+               this.size = size;
+       }
+
+       /**
+        * @return the availabilityZone
+        */
+       public String getAvailabilityZone() {
+               return availabilityZone;
+       }
+
+       /**
+        * @param availabilityZone the availabilityZone to set
+        */
+       public void setAvailabilityZone(String availabilityZone) {
+               this.availabilityZone = availabilityZone;
+       }
+
+       /**
+        * @return the name
+        */
+       public String getName() {
+               return name;
+       }
+
+       /**
+        * @param name the name to set
+        */
+       public void setName(String name) {
+               this.name = name;
+       }
+
+       /**
+        * @return the description
+        */
+       public String getDescription() {
+               return description;
+       }
+
+       /**
+        * @param description the description to set
+        */
+       public void setDescription(String description) {
+               this.description = description;
+       }
+
+       /**
+        * @return the snapshotId
+        */
+       public Integer getSnapshotId() {
+               return snapshotId;
+       }
+
+       /**
+        * @param snapshotId the snapshotId to set
+        */
+       public void setSnapshotId(Integer snapshotId) {
+               this.snapshotId = snapshotId;
+       }
+
+       /**
+        * @return the metadata
+        */
+       public Map<String, String> getMetadata() {
+               return metadata;
+       }
+
+       /**
+        * @param metadata the metadata to set
+        */
+       public void setMetadata(Map<String, String> metadata) {
+               this.metadata = metadata;
+       }
+
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "VolumeForCreate [size=" + size + ", availabilityZone="
+                               + availabilityZone + ", name=" + name + ", description="
+                               + description + ", snapshotId=" + snapshotId + ", metadata="
+                               + metadata + "]";
+       }
+
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/VolumeForImageCreate.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/VolumeForImageCreate.java
new file mode 100644 (file)
index 0000000..994d49a
--- /dev/null
@@ -0,0 +1,71 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("os-volume_upload_image")
+public class VolumeForImageCreate implements Serializable {
+       String volumeId;
+       String tenantId;
+
+       public String getTenantId() {
+               return tenantId;
+       }
+
+       public void setTenantId(String tenantId) {
+               this.tenantId = tenantId;
+       }
+
+       @JsonProperty("force")
+       private Boolean force;
+
+       public Boolean getForce() {
+               return force;
+       }
+
+       public void setForce(Boolean force) {
+               this.force = force;
+       }
+
+       @JsonProperty("container_format")
+       String container_format;
+       @JsonProperty("disk_format")
+       String disk_format;
+       @JsonProperty("image_name")
+       String image_name;
+
+       public String getVolumeId() {
+               return volumeId;
+       }
+
+       public void setVolumeId(String volumeId) {
+               this.volumeId = volumeId;
+       }
+
+       public String getContainer_format() {
+               return container_format;
+       }
+
+       public void setContainer_format(String container_format) {
+               this.container_format = container_format;
+       }
+
+       public String getDisk_format() {
+               return disk_format;
+       }
+
+       public void setDisk_format(String disk_format) {
+               this.disk_format = disk_format;
+       }
+
+       public String getImage_name() {
+               return image_name;
+       }
+
+       public void setImage_name(String image_name) {
+               this.image_name = image_name;
+       }
+
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/VolumeType.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/VolumeType.java
new file mode 100644 (file)
index 0000000..4c25e4b
--- /dev/null
@@ -0,0 +1,10 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("volume-type")
+public class VolumeType implements Serializable {
+
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/VolumeTypes.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/VolumeTypes.java
new file mode 100644 (file)
index 0000000..42d8162
--- /dev/null
@@ -0,0 +1,34 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class VolumeTypes implements Iterable<VolumeType>, Serializable {
+
+       @JsonProperty("volume-types")
+       private List<VolumeType> list;
+
+       /**
+        * @return the list
+        */
+       public List<VolumeType> getList() {
+               return list;
+       }
+
+       @Override
+       public Iterator<VolumeType> iterator() {
+               return list.iterator();
+       }
+       
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "VolumeTypes [list=" + list + "]";
+       }
+       
+}
diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/Volumes.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/Volumes.java
new file mode 100644 (file)
index 0000000..349ef87
--- /dev/null
@@ -0,0 +1,34 @@
+package com.woorea.openstack.nova.model;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class Volumes implements Iterable<Volume>, Serializable {
+
+       @JsonProperty("volumes")
+       private List<Volume> list;
+
+       /**
+        * @return the list
+        */
+       public List<Volume> getList() {
+               return list;
+       }
+       
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Volumes [list=" + list + "]";
+       }
+
+       @Override
+       public Iterator<Volume> iterator() {
+               return list.iterator();
+       }
+       
+}
diff --git a/openstack-client-connectors/http-connector/pom.xml b/openstack-client-connectors/http-connector/pom.xml
new file mode 100644 (file)
index 0000000..375f579
--- /dev/null
@@ -0,0 +1,31 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.openecomp.mso.libs.openstack-java-sdk</groupId>
+    <artifactId>client-connectors</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+  </parent>
+  
+  <groupId>org.openecomp.mso.libs.openstack-java-sdk.client-connectors</groupId>
+  <artifactId>http-connector</artifactId>
+  <name>OpenStack HTTP-Client Connector</name>
+  <description>OpenStack HTTP-Client Connector</description>
+  <dependencies>
+       <dependency>
+               <groupId>org.apache.httpcomponents</groupId>
+               <artifactId>httpclient</artifactId>
+               <version>4.3.5</version>
+       </dependency>
+       <dependency>
+               <groupId>org.codehaus.jackson</groupId>
+               <artifactId>jackson-mapper-asl</artifactId>
+               <version>1.9.13</version>
+       </dependency>
+       <dependency>
+               <groupId>log4j</groupId>
+               <artifactId>log4j</artifactId>
+               <version>1.2.17</version>
+       </dependency>
+  </dependencies>
+  
+</project>
\ No newline at end of file
diff --git a/openstack-client-connectors/http-connector/src/main/java/com/woorea/openstack/connector/HttpClientConnector.java b/openstack-client-connectors/http-connector/src/main/java/com/woorea/openstack/connector/HttpClientConnector.java
new file mode 100644 (file)
index 0000000..d748a79
--- /dev/null
@@ -0,0 +1,227 @@
+/*
+ * ============LICENSE_START==========================================
+ * ===================================================================
+ * Copyright Â© 2017 AT&T Intellectual Property. All rights reserved.
+ * ===================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ *
+ */
+
+package com.woorea.openstack.connector;
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.UnknownHostException;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpStatus;
+import org.apache.http.client.HttpResponseException;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpDelete;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.methods.HttpPut;
+import org.apache.http.client.methods.HttpUriRequest;
+import org.apache.http.client.utils.URIBuilder;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.log4j.Logger;
+import org.codehaus.jackson.JsonProcessingException;
+import org.codehaus.jackson.map.DeserializationConfig;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.map.SerializationConfig;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
+
+import com.woorea.openstack.base.client.OpenStackClientConnector;
+import com.woorea.openstack.base.client.OpenStackConnectException;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.base.client.OpenStackResponse;
+import com.woorea.openstack.base.client.OpenStackResponseException;
+
+public class HttpClientConnector implements OpenStackClientConnector {
+
+       public static ObjectMapper DEFAULT_MAPPER;
+       public static ObjectMapper WRAPPED_MAPPER;
+       
+       private static Logger LOGGER = Logger.getLogger(HttpClientConnector.class);
+
+       static {
+               DEFAULT_MAPPER = new ObjectMapper();
+
+               DEFAULT_MAPPER.setSerializationInclusion(Inclusion.NON_NULL);
+               DEFAULT_MAPPER.disable(SerializationConfig.Feature.INDENT_OUTPUT);
+               DEFAULT_MAPPER.enable(DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
+               DEFAULT_MAPPER.disable(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES);
+
+               WRAPPED_MAPPER = new ObjectMapper();
+
+               WRAPPED_MAPPER.setSerializationInclusion(Inclusion.NON_NULL);
+               WRAPPED_MAPPER.disable(SerializationConfig.Feature.INDENT_OUTPUT);
+               WRAPPED_MAPPER.enable(SerializationConfig.Feature.WRAP_ROOT_VALUE);
+               WRAPPED_MAPPER.enable(DeserializationConfig.Feature.UNWRAP_ROOT_VALUE);
+               WRAPPED_MAPPER.enable(DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
+               WRAPPED_MAPPER.disable(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES);
+       }
+       
+       protected static <T> ObjectMapper getObjectMapper (Class<T> type) {
+               return type.getAnnotation(JsonRootName.class) == null ? DEFAULT_MAPPER : WRAPPED_MAPPER;
+       }
+
+       public <T> OpenStackResponse request(OpenStackRequest<T> request) {
+               
+               CloseableHttpClient httpClient = null; //HttpClients.createDefault();
+               httpClient = HttpClients.custom().setRedirectStrategy(new HttpClientRedirectStrategy()).build();
+
+               URI uri = null;
+               
+               // Build the URI with query params
+               try {
+                       URIBuilder uriBuilder = new URIBuilder(request.endpoint() + request.path());
+
+                       for(Map.Entry<String, List<Object> > entry : request.queryParams().entrySet()) {
+                               for (Object o : entry.getValue()) {
+                                       uriBuilder.setParameter(entry.getKey(), String.valueOf(o));
+                               }
+                       }
+                       
+                       uri = uriBuilder.build();
+               } catch (URISyntaxException e) {
+                       throw new HttpClientException (e);
+               }
+
+               HttpEntity entity = null;
+               if (request.entity() != null) {
+                       // Flatten the entity to a Json string
+                                       
+                       try {
+                       // Get appropriate mapper, based on existence of a root element in Entity class
+                               ObjectMapper mapper = getObjectMapper (request.entity().getEntity().getClass());
+
+                               String entityJson = mapper.writeValueAsString (request.entity().getEntity());
+                               entity = new StringEntity(entityJson, ContentType.create(request.entity().getContentType()));
+                               
+                               System.out.println("Openstack query JSON:"+entityJson);
+                               LOGGER.debug ("Request JSON Body: " + entityJson.replaceAll("\"password\":\"[^\"]*\"", "\"password\":\"***\""));
+
+                       } catch (JsonProcessingException e) {
+                               throw new HttpClientException ("Json processing error on request entity", e);
+                       } catch (IOException e) {
+                               throw new HttpClientException ("Json IO error on request entity", e);
+                       }
+               }
+               
+               // Determine the HttpRequest class based on the method
+               HttpUriRequest httpRequest;
+               
+               switch (request.method()) {
+               case POST:
+                       HttpPost post = new HttpPost(uri);
+                       post.setEntity (entity);
+                       httpRequest = post;
+                       break;
+                       
+               case GET:
+                       httpRequest = new HttpGet(uri);
+                       break;
+
+               case PUT:
+                       HttpPut put = new HttpPut(uri);
+                       put.setEntity (entity);
+                       httpRequest = put;
+                       break;
+                       
+               case DELETE:
+                       httpRequest = new HttpDelete(uri);
+                       break;
+                       
+               default:
+                       throw new HttpClientException ("Unrecognized HTTP Method: " + request.method());
+               }
+               
+               for (Entry<String, List<Object>> h : request.headers().entrySet()) {
+                       StringBuilder sb = new StringBuilder();
+                       for (Object v : h.getValue()) {
+                               sb.append(String.valueOf(v));
+                       }
+                       httpRequest.addHeader(h.getKey(), sb.toString());
+               }
+
+               LOGGER.debug ("Sending HTTP request: " + httpRequest.toString());
+               
+               // Get the Response.  But don't get the body entity yet, as this response
+               // will be wrapped in an HttpClientResponse.  The HttpClientResponse
+               // buffers the body in constructor, so can close the response here.
+               HttpClientResponse httpClientResponse = null;
+               CloseableHttpResponse httpResponse = null;
+               
+               // Catch known HttpClient exceptions, and wrap them in OpenStack Client Exceptions
+               // so calling functions can distinguish.  Only RuntimeExceptions are allowed.
+               try {
+                       httpResponse = httpClient.execute(httpRequest);
+
+                       LOGGER.debug ("Response status: " + httpResponse.getStatusLine().getStatusCode());
+                       
+                       httpClientResponse = new HttpClientResponse (httpResponse);
+
+                       int status = httpResponse.getStatusLine().getStatusCode();
+                       if (status == HttpStatus.SC_OK || status == HttpStatus.SC_CREATED ||
+                               status == HttpStatus.SC_NO_CONTENT || status == HttpStatus.SC_ACCEPTED)
+                       {
+                               return httpClientResponse;
+                       }
+               }
+               catch (HttpResponseException e) {
+                       // What exactly does this mean?  It does not appear to get thrown for
+                       // non-2XX responses as documented.
+                       throw new OpenStackResponseException(e.getMessage(), e.getStatusCode());
+               }
+               catch (UnknownHostException e) {
+                       throw new OpenStackConnectException("Unknown Host: " + e.getMessage());
+               }
+               catch (IOException e) {
+                       // Catch all other IOExceptions and throw as OpenStackConnectException
+                       throw new OpenStackConnectException(e.getMessage());
+               }
+               catch (Exception e) {
+                       // Catchall for anything else, must throw as a RuntimeException
+                       e.printStackTrace();
+                       throw new RuntimeException("Unexpected client exception", e);
+               }
+               finally {
+                       // Have the body.  Close the stream
+                       if (httpResponse != null)
+                               try {
+                                       httpResponse.close();
+                               } catch (IOException e) {
+                                       LOGGER.warn("Unable to close HTTP Response: " + e);
+                               }
+               }
+               
+               // Get here on an error response (4XX-5XX)
+               throw new OpenStackResponseException(httpResponse.getStatusLine().getReasonPhrase(),
+                                                                                       httpResponse.getStatusLine().getStatusCode(),
+                                                                                       httpClientResponse);
+       }
+
+}
diff --git a/openstack-client-connectors/http-connector/src/main/java/com/woorea/openstack/connector/HttpClientException.java b/openstack-client-connectors/http-connector/src/main/java/com/woorea/openstack/connector/HttpClientException.java
new file mode 100644 (file)
index 0000000..9f93455
--- /dev/null
@@ -0,0 +1,45 @@
+/*\r
+ * ============LICENSE_START==========================================\r
+ * ===================================================================\r
+ * Copyright Â© 2017 AT&T Intellectual Property. All rights reserved.\r
+ * ===================================================================\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *        http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ * ============LICENSE_END============================================\r
+ *\r
+ * ECOMP and OpenECOMP are trademarks\r
+ * and service marks of AT&T Intellectual Property.\r
+ *\r
+ */\r
+\r
+package com.woorea.openstack.connector;\r
+\r
+/*\r
+ * Declare a RuntimeException since the Interface does not declare any\r
+ * throwables.  Any caught exception will be wrapped in HttpClientException\r
+ */\r
+public class HttpClientException extends RuntimeException {\r
+\r
+       private static final long serialVersionUID = 1L;\r
+\r
+       public HttpClientException (String s) {\r
+               super (s);\r
+       }\r
+       \r
+       public HttpClientException (Exception e) {\r
+               super ("Caught nested exception in HttpClient", e);\r
+       }\r
+       \r
+       public HttpClientException (String s, Exception e) {\r
+               super (s, e);\r
+       }\r
+}\r
diff --git a/openstack-client-connectors/http-connector/src/main/java/com/woorea/openstack/connector/HttpClientRedirectStrategy.java b/openstack-client-connectors/http-connector/src/main/java/com/woorea/openstack/connector/HttpClientRedirectStrategy.java
new file mode 100644 (file)
index 0000000..88f20bb
--- /dev/null
@@ -0,0 +1,109 @@
+/*\r
+ * ============LICENSE_START==========================================\r
+ * ===================================================================\r
+ * Copyright Â© 2017 AT&T Intellectual Property. All rights reserved.\r
+ * ===================================================================\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *        http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ * ============LICENSE_END============================================\r
+ *\r
+ * ECOMP and OpenECOMP are trademarks\r
+ * and service marks of AT&T Intellectual Property.\r
+ *\r
+ */\r
+\r
+package com.woorea.openstack.connector;\r
+\r
+import java.net.URI;\r
+\r
+import org.apache.http.HttpRequest;\r
+import org.apache.http.HttpResponse;\r
+import org.apache.http.HttpStatus;\r
+import org.apache.http.ProtocolException;\r
+import org.apache.http.annotation.Immutable;\r
+import org.apache.http.client.methods.HttpGet;\r
+import org.apache.http.client.methods.HttpHead;\r
+import org.apache.http.client.methods.HttpDelete;\r
+import org.apache.http.client.methods.HttpUriRequest;\r
+import org.apache.http.client.methods.RequestBuilder;\r
+import org.apache.http.impl.client.DefaultRedirectStrategy;\r
+import org.apache.http.protocol.HttpContext;\r
+\r
+/**\r
+ * Custom {@link org.apache.http.client.RedirectStrategy} implementation\r
+ * that automatically redirects all HEAD, GET and DELETE requests.\r
+ * The {@link org.apache.http.client.DefaultRedirectStrategy} only\r
+ * redirects GET and HEAD automatically, per the HTTP specification\r
+ * (POST and PUT typically have bodies and thus cannot be redirected).\r
+ * \r
+ * A custom strategy is needed for the Openstack API, which can also send\r
+ * 302 on a DELETE (by name) request, expecting the client to follow the\r
+ * redirect to perform the actual deletion. \r
+ */\r
+@Immutable\r
+public class HttpClientRedirectStrategy extends DefaultRedirectStrategy {\r
+\r
+    /**\r
+     * Redirectable methods.\r
+     */\r
+    private static final String[] REDIRECT_METHODS = new String[] {\r
+        HttpGet.METHOD_NAME,\r
+        HttpDelete.METHOD_NAME,\r
+        HttpHead.METHOD_NAME\r
+    };\r
+\r
+    /**\r
+     * Determine if the request should be redirected.\r
+     * This may not actually be needed, since the REDIRECT_METHODS\r
+     * array has been updated with the DELETE.\r
+     */\r
+    @Override\r
+    protected boolean isRedirectable(final String method) {\r
+        for (final String m: REDIRECT_METHODS) {\r
+            if (m.equalsIgnoreCase(method)) {\r
+                return true;\r
+            }\r
+        }\r
+        return false;\r
+    }\r
+\r
+    /**\r
+     * Override the default redirect handling method.  As implemented\r
+     * in HttpClient, it does not preserve the method on 301 or 302\r
+     * responses, always redirecting to a GET.\r
+     */\r
+    @Override\r
+    public HttpUriRequest getRedirect(\r
+            final HttpRequest request,\r
+            final HttpResponse response,\r
+            final HttpContext context) throws ProtocolException {\r
+       \r
+        final URI uri = getLocationURI(request, response, context);\r
+        final String method = request.getRequestLine().getMethod();\r
+        if (method.equalsIgnoreCase(HttpHead.METHOD_NAME)) {\r
+            return new HttpHead(uri);\r
+        } else if (method.equalsIgnoreCase(HttpGet.METHOD_NAME)) {\r
+            return new HttpGet(uri);\r
+        } else {\r
+\r
+            final int status = response.getStatusLine().getStatusCode();\r
+            \r
+               HttpUriRequest newRequest = null;\r
+               if (status == HttpStatus.SC_TEMPORARY_REDIRECT || status == HttpStatus.SC_MOVED_TEMPORARILY) {\r
+                newRequest = RequestBuilder.copy(request).setUri(uri).build();\r
+            } else {\r
+                newRequest =  new HttpGet(uri);\r
+            }\r
+               return newRequest;\r
+        }\r
+    }\r
+}\r
diff --git a/openstack-client-connectors/http-connector/src/main/java/com/woorea/openstack/connector/HttpClientResponse.java b/openstack-client-connectors/http-connector/src/main/java/com/woorea/openstack/connector/HttpClientResponse.java
new file mode 100644 (file)
index 0000000..e1850a2
--- /dev/null
@@ -0,0 +1,110 @@
+/*
+ * ============LICENSE_START==========================================
+ * ===================================================================
+ * Copyright Â© 2017 AT&T Intellectual Property. All rights reserved.
+ * ===================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ *
+ */
+
+package com.woorea.openstack.connector;
+
+import org.apache.http.Header;
+import org.apache.http.HttpResponse;
+import org.apache.log4j.Logger;
+import org.codehaus.jackson.map.ObjectMapper;
+
+import com.woorea.openstack.base.client.OpenStackResponse;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+public class HttpClientResponse implements OpenStackResponse {
+
+       private static Logger LOGGER = Logger.getLogger(HttpClientConnector.class);
+       
+    private HttpResponse response = null;
+    private String entityBody = null;
+
+    public HttpClientResponse(HttpResponse response)
+    {
+        this.response = response;
+        
+        // Read the body so InputStream can be closed
+        if (response.getEntity() == null) {
+               // No body
+               LOGGER.debug ("No Response Body");
+               return;
+        }
+        
+               ByteArrayOutputStream responseBody = new ByteArrayOutputStream();
+               try {
+                       response.getEntity().writeTo(responseBody);
+               } catch (IOException e) {
+                       throw new HttpClientException ("Error Reading Response Body", e);
+               }
+               entityBody = responseBody.toString();
+               LOGGER.debug (entityBody);
+    }
+
+    
+    @Override
+       public <T> T getEntity (Class<T> returnType) {
+       // Get appropriate mapper, based on existence of a root element
+               ObjectMapper mapper = HttpClientConnector.getObjectMapper (returnType);
+
+               T resp = null;
+               try {
+                       resp = mapper.readValue(entityBody, returnType);
+               } catch (Exception e) {
+                       throw new HttpClientException ("Caught exception in getEntity", e);
+               }
+               return resp;
+    }
+
+    @Override
+    public <T> T getErrorEntity(Class<T> returnType) {
+        return getEntity(returnType);
+    }
+
+    @Override
+    public InputStream getInputStream() {
+               return new ByteArrayInputStream (entityBody.getBytes());
+    }
+
+    @Override
+    public String header(String name) {
+        return response.getFirstHeader(name).getValue();
+    }
+
+    @Override
+    public Map<String, String> headers() {
+        Map<String, String> headers = new HashMap<String, String>();
+
+        Header responseHeaders[] = response.getAllHeaders();
+        for (Header h : responseHeaders) {
+            headers.put(h.getName(), h.getValue());
+        }
+
+        return headers;
+    }
+
+}
diff --git a/openstack-client-connectors/http-connector/src/main/resources/META-INF/services/com.woorea.openstack.base.client.OpenStackClientConnector b/openstack-client-connectors/http-connector/src/main/resources/META-INF/services/com.woorea.openstack.base.client.OpenStackClientConnector
new file mode 100644 (file)
index 0000000..1281d32
--- /dev/null
@@ -0,0 +1 @@
+com.woorea.openstack.connector.HttpClientConnector
\ No newline at end of file
diff --git a/openstack-client-connectors/jersey-connector/pom.xml b/openstack-client-connectors/jersey-connector/pom.xml
new file mode 100644 (file)
index 0000000..24489d9
--- /dev/null
@@ -0,0 +1,25 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.openecomp.mso.libs.openstack-java-sdk</groupId>
+    <artifactId>client-connectors</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+  </parent>
+  <groupId>org.openecomp.mso.libs.openstack-java-sdk.client-connectors</groupId>
+  <artifactId>jersey-connector</artifactId>
+  <name>OpenStack Jersey Connector</name>
+  <description>OpenStack Jersey Connector</description>
+  <dependencies>
+  <dependency>
+       <groupId>com.sun.jersey</groupId>
+       <artifactId>jersey-client</artifactId>
+       <version>1.17.1</version>
+  </dependency>
+  <dependency>
+       <groupId>org.codehaus.jackson</groupId>
+       <artifactId>jackson-jaxrs</artifactId>
+       <version>1.9.12</version>
+  </dependency>
+  </dependencies>
+  
+</project>
diff --git a/openstack-client-connectors/jersey-connector/src/main/java/com/woorea/openstack/connector/JerseyConnector.java b/openstack-client-connectors/jersey-connector/src/main/java/com/woorea/openstack/connector/JerseyConnector.java
new file mode 100644 (file)
index 0000000..afd7a2b
--- /dev/null
@@ -0,0 +1,104 @@
+package com.woorea.openstack.connector;
+
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Logger;
+
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.ext.ContextResolver;
+import javax.ws.rs.ext.Provider;
+
+import org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider;
+import org.codehaus.jackson.map.DeserializationConfig;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.map.SerializationConfig;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
+
+import com.sun.jersey.api.client.Client;
+import com.sun.jersey.api.client.ClientResponse;
+import com.sun.jersey.api.client.UniformInterfaceException;
+import com.sun.jersey.api.client.WebResource;
+import com.sun.jersey.api.client.config.ClientConfig;
+import com.sun.jersey.api.client.config.DefaultClientConfig;
+import com.sun.jersey.client.impl.ClientRequestImpl;
+import com.sun.jersey.core.header.OutBoundHeaders;
+import com.woorea.openstack.base.client.OpenStackClientConnector;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.base.client.OpenStackResponse;
+import com.woorea.openstack.base.client.OpenStackResponseException;
+
+public class JerseyConnector implements OpenStackClientConnector {
+       
+       protected Client client = null;
+    protected boolean logPassword;
+    private JerseyLoggingFilter logger = new JerseyLoggingFilter(Logger.getLogger("os"));
+
+       public JerseyConnector() {
+               ClientConfig clientConfig = new DefaultClientConfig();
+               clientConfig.getClasses().add(JacksonJaxbJsonProvider.class);
+               clientConfig.getClasses().add(OpenStackObjectMapper.class);
+               client = Client.create(clientConfig);
+       }
+
+       @Override
+       public <T> OpenStackResponse request(OpenStackRequest<T> request) {
+               WebResource target = client.resource(request.endpoint()).path(request.path());
+               for(Map.Entry<String, List<Object> > entry : request.queryParams().entrySet()) {
+                       for (Object o : entry.getValue()) {
+                               target = target.queryParam(entry.getKey(), String.valueOf(o));
+                       }
+               }
+               target.addFilter(logger);
+               MultivaluedMap<String, Object> headers = new OutBoundHeaders();
+               for(Map.Entry<String, List<Object>> h : request.headers().entrySet()) {
+                       for(Object v : h.getValue()) {
+                               headers.add(h.getKey(), v);
+                       }
+               }
+               if(request.entity() != null && request.entity().getContentType() != null) {
+                       headers.add("Content-Type", request.entity().getContentType());
+               } else {
+                       headers.add("Content-Type", "application/json");
+               }
+               try {
+                       ClientResponse response = null;
+                       if (request.entity() != null && request.entity().getEntity() != null) {
+                               response = target.getHeadHandler().handle(new ClientRequestImpl(target.getURI(), request.method().name(), request.entity().getEntity(), headers));
+                       } else {
+                               response = target.getHeadHandler().handle(new ClientRequestImpl(target.getURI(), request.method().name(), null, headers));
+                       }
+                       return new JerseyResponse(response);
+               } catch (UniformInterfaceException e) {
+                       throw new OpenStackResponseException(e.getResponse().getClientResponseStatus().getReasonPhrase(), e.getResponse().getStatus());
+               }
+       }
+
+       @Provider
+       public static class OpenStackObjectMapper implements ContextResolver<ObjectMapper> {
+               static ObjectMapper DEFAULT_MAPPER;
+               static ObjectMapper WRAPPED_MAPPER;
+               static {
+                       DEFAULT_MAPPER = new ObjectMapper();
+                       DEFAULT_MAPPER.setSerializationInclusion(Inclusion.NON_NULL);
+                       DEFAULT_MAPPER.enable(SerializationConfig.Feature.INDENT_OUTPUT);
+                       DEFAULT_MAPPER.enable(DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
+                       DEFAULT_MAPPER.disable(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES);
+                       DEFAULT_MAPPER.enable(DeserializationConfig.Feature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
+
+                       WRAPPED_MAPPER = new ObjectMapper();
+                       WRAPPED_MAPPER.setSerializationInclusion(Inclusion.NON_NULL);
+                       WRAPPED_MAPPER.enable(SerializationConfig.Feature.INDENT_OUTPUT);
+                       WRAPPED_MAPPER.enable(SerializationConfig.Feature.WRAP_ROOT_VALUE);
+                       WRAPPED_MAPPER.enable(DeserializationConfig.Feature.UNWRAP_ROOT_VALUE);
+                       WRAPPED_MAPPER.enable(DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
+                       WRAPPED_MAPPER.disable(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES);
+                       WRAPPED_MAPPER.enable(DeserializationConfig.Feature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
+               }
+               
+               @Override
+               public ObjectMapper getContext(Class<?> type) {
+                       return type.getAnnotation(JsonRootName.class) == null ? DEFAULT_MAPPER : WRAPPED_MAPPER;
+               }
+       }
+}
diff --git a/openstack-client-connectors/jersey-connector/src/main/java/com/woorea/openstack/connector/JerseyLoggingFilter.java b/openstack-client-connectors/jersey-connector/src/main/java/com/woorea/openstack/connector/JerseyLoggingFilter.java
new file mode 100644 (file)
index 0000000..c1877c3
--- /dev/null
@@ -0,0 +1,279 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright (c) 2010-2011 Oracle and/or its affiliates. All rights reserved.
+ *
+ * The contents of this file are subject to the terms of either the GNU
+ * General Public License Version 2 only ("GPL") or the Common Development
+ * and Distribution License("CDDL") (collectively, the "License").  You
+ * may not use this file except in compliance with the License.  You can
+ * obtain a copy of the License at
+ * http://glassfish.java.net/public/CDDL+GPL_1_1.html
+ * or packager/legal/LICENSE.txt.  See the License for the specific
+ * language governing permissions and limitations under the License.
+ *
+ * When distributing the software, include this License Header Notice in each
+ * file and include the License file at packager/legal/LICENSE.txt.
+ *
+ * GPL Classpath Exception:
+ * Oracle designates this particular file as subject to the "Classpath"
+ * exception as provided by Oracle in the GPL Version 2 section of the License
+ * file that accompanied this code.
+ *
+ * Modifications:
+ * If applicable, add the following below the License Header, with the fields
+ * enclosed by brackets [] replaced by your own identifying information:
+ * "Portions Copyright [year] [name of copyright owner]"
+ *
+ * Contributor(s):
+ * If you wish your version of this file to be governed by only the CDDL or
+ * only the GPL Version 2, indicate your decision by adding "[Contributor]
+ * elects to include this software in this distribution under the [CDDL or GPL
+ * Version 2] license."  If you don't indicate a single choice of license, a
+ * recipient has the option to distribute your version of this file under
+ * either the CDDL, the GPL Version 2 or to extend the choice of license to
+ * its licensees as provided above.  However, if you add GPL Version 2 code
+ * and therefore, elected the GPL Version 2 license, then the option applies
+ * only if the new code is made subject to such option by the copyright
+ * holder.
+ */
+package com.woorea.openstack.connector;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Logger;
+
+import javax.ws.rs.core.MultivaluedMap;
+
+import com.sun.jersey.api.client.AbstractClientRequestAdapter;
+import com.sun.jersey.api.client.ClientHandlerException;
+import com.sun.jersey.api.client.ClientRequest;
+import com.sun.jersey.api.client.ClientRequestAdapter;
+import com.sun.jersey.api.client.ClientResponse;
+import com.sun.jersey.api.client.filter.ClientFilter;
+import com.sun.jersey.api.client.filter.LoggingFilter;
+import com.sun.jersey.core.util.ReaderWriter;
+
+/**
+ * A logging filter.
+ * 
+ */
+public class JerseyLoggingFilter extends ClientFilter {
+
+    private static final Logger LOGGER = Logger.getLogger(LoggingFilter.class.getName());
+
+    private static final String NOTIFICATION_PREFIX = "* ";
+    
+    private static final String REQUEST_PREFIX = "> ";
+    
+    private static final String RESPONSE_PREFIX = "< ";
+
+    private static final String PASSWORD_PATTERN = "\"password\".*:.*\"(.*)\"";
+    
+    private final class Adapter extends AbstractClientRequestAdapter {
+        private final StringBuilder b;
+
+        Adapter(ClientRequestAdapter cra, StringBuilder b) {
+            super(cra);
+            this.b = b;
+        }
+
+        public OutputStream adapt(ClientRequest request, OutputStream out) throws IOException {
+            return new LoggingOutputStream(getAdapter().adapt(request, out), b);
+        }
+        
+    }
+
+    private final class LoggingOutputStream extends OutputStream {
+        private final OutputStream out;
+        
+        private final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        
+        private final StringBuilder b;
+
+        LoggingOutputStream(OutputStream out, StringBuilder b) {
+            this.out = out;
+            this.b = b;
+        }
+        
+        @Override
+        public void write(byte[] b)  throws IOException {
+            baos.write(b);
+            out.write(b);
+        }
+    
+        @Override
+        public void write(byte[] b, int off, int len)  throws IOException {
+            baos.write(b, off, len);
+            out.write(b, off, len);
+        }
+
+        @Override
+        public void write(int b) throws IOException {
+            baos.write(b);
+            out.write(b);
+        }
+
+        @Override
+        public void close() throws IOException {
+            printEntity(b, baos.toByteArray());
+            log(b);
+            out.close();
+        }
+    }
+
+    private final PrintStream loggingStream;
+
+    private final Logger logger;
+
+    private long _id = 0;
+
+    /**
+     * Create a logging filter logging the request and response to
+     * a default JDK logger, named as the fully qualified class name of this
+     * class.
+     */
+    public JerseyLoggingFilter() {
+        this(LOGGER);
+    }
+
+    /**
+     * Create a logging filter logging the request and response to
+     * a JDK logger.
+     * 
+     * @param logger the logger to log requests and responses.
+     */
+    public JerseyLoggingFilter(Logger logger) {
+        this.loggingStream = null;
+        this.logger = logger;
+    }
+
+    /**
+     * Create a logging filter logging the request and response to
+     * print stream.
+     *
+     * @param loggingStream the print stream to log requests and responses.
+     */
+    public JerseyLoggingFilter(PrintStream loggingStream) {
+        this.loggingStream = loggingStream;
+        this.logger = null;
+    }
+
+    private void log(StringBuilder b) {
+        if (logger != null) {
+            logger.info(b.toString());
+        } else {
+            loggingStream.print(b);
+        }
+    }
+
+    private StringBuilder prefixId(StringBuilder b, long id) {
+        b.append(Long.toString(id)).append(" ");
+        return b;
+    }
+
+    @Override
+    public ClientResponse handle(ClientRequest request) throws ClientHandlerException {
+        long id = ++this._id;
+
+        logRequest(id, request);
+
+        ClientResponse response = getNext().handle(request);
+
+        logResponse(id, response);
+
+        return response;
+    }
+
+    private void logRequest(long id, ClientRequest request) {
+        StringBuilder b = new StringBuilder();
+        
+        printRequestLine(b, id, request);
+        printRequestHeaders(b, id, request.getHeaders());
+
+        if (request.getEntity() != null) {
+            request.setAdapter(new Adapter(request.getAdapter(), b));
+        } else {
+            log(b);
+        }
+    }
+
+    private void printRequestLine(StringBuilder b, long id, ClientRequest request) {
+        prefixId(b, id).append(NOTIFICATION_PREFIX).append("Client out-bound request").append("\n");
+        prefixId(b, id).append(REQUEST_PREFIX).append(request.getMethod()).append(" ").
+                append(request.getURI().toASCIIString()).append("\n");
+    }
+
+    private void printRequestHeaders(StringBuilder b, long id, MultivaluedMap<String, Object> headers) {
+        for (Map.Entry<String, List<Object>> e : headers.entrySet()) {
+            List<Object> val = e.getValue();
+            String header = e.getKey();
+
+            if(val.size() == 1) {
+                prefixId(b, id).append(REQUEST_PREFIX).append(header).append(": ").append(ClientRequest.getHeaderValue(val.get(0))).append("\n");
+            } else {
+                StringBuilder sb = new StringBuilder();
+                boolean add = false;
+                for(Object o : val) {
+                    if(add) sb.append(',');
+                    add = true;
+                    sb.append(ClientRequest.getHeaderValue(o));
+                }
+                prefixId(b, id).append(REQUEST_PREFIX).append(header).append(": ").append(sb.toString()).append("\n");
+            }
+        }
+    }
+
+    private void logResponse(long id, ClientResponse response) {
+        StringBuilder b = new StringBuilder();
+
+        printResponseLine(b, id, response);
+        printResponseHeaders(b, id, response.getHeaders());
+
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        InputStream in = response.getEntityInputStream();
+        try {
+            ReaderWriter.writeTo(in, out);
+
+            byte[] requestEntity = out.toByteArray();
+            printEntity(b, requestEntity);
+            response.setEntityInputStream(new ByteArrayInputStream(requestEntity));
+        } catch (IOException ex) {
+            throw new ClientHandlerException(ex);
+        }
+        log(b);
+    }
+
+    private void printResponseLine(StringBuilder b, long id, ClientResponse response) {
+        prefixId(b, id).append(NOTIFICATION_PREFIX).
+                append("Client in-bound response").append("\n");
+        prefixId(b, id).append(RESPONSE_PREFIX).
+                append(Integer.toString(response.getStatus())).
+                append("\n");
+    }
+    
+    private void printResponseHeaders(StringBuilder b, long id, MultivaluedMap<String, String> headers) {
+        for (Map.Entry<String, List<String>> e : headers.entrySet()) {
+            String header = e.getKey();
+            for (String value : e.getValue()) {
+                prefixId(b, id).append(RESPONSE_PREFIX).append(header).append(": ").
+                        append(value).append("\n");
+            }
+        }
+        prefixId(b, id).append(RESPONSE_PREFIX).append("\n");
+    }
+
+    private void printEntity(StringBuilder b, byte[] entity) throws IOException {
+        if (entity.length == 0)
+            return;
+        String entityString = new String(entity);
+        entityString = entityString.replaceAll(PASSWORD_PATTERN, "\"password\" : \"******\"");
+        b.append(entityString).append("\n");
+    }
+}
\ No newline at end of file
diff --git a/openstack-client-connectors/jersey-connector/src/main/java/com/woorea/openstack/connector/JerseyResponse.java b/openstack-client-connectors/jersey-connector/src/main/java/com/woorea/openstack/connector/JerseyResponse.java
new file mode 100644 (file)
index 0000000..5e8dc8c
--- /dev/null
@@ -0,0 +1,66 @@
+package com.woorea.openstack.connector;\r
+\r
+/*\r
+ * Modifications copyright (c) 2017 AT&T Intellectual Property\r
+ */\r
+\r
+import java.io.InputStream;\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+\r
+import com.sun.jersey.api.client.ClientResponse;\r
+import com.woorea.openstack.base.client.OpenStackResponse;\r
+import com.woorea.openstack.base.client.OpenStackResponseException;\r
+\r
+public class JerseyResponse implements OpenStackResponse {\r
+\r
+       private ClientResponse response;\r
+\r
+       public JerseyResponse(ClientResponse response) {\r
+               this.response = response;\r
+       }\r
+\r
+       @Override\r
+       public <T> T getEntity(Class<T> returnType) {\r
+               if(response.getStatus() >= 400) {\r
+                       throw new OpenStackResponseException(response.getClientResponseStatus().getReasonPhrase(), \r
+                                       response.getStatus(), this);\r
+               }\r
+               if(response.hasEntity() && returnType != null && Void.class != returnType) {\r
+                       return response.getEntity(returnType);\r
+               } else {\r
+                       return null;\r
+               }\r
+       }\r
+\r
+       @Override\r
+       public <T> T getErrorEntity(Class<T> returnType) {\r
+               if(response.getStatus() >= 400 && response.hasEntity()) {\r
+                       return response.getEntity(returnType);\r
+               }\r
+               return null;\r
+       }\r
+\r
+       @Override\r
+       public InputStream getInputStream() {\r
+               if(response.hasEntity()) {\r
+                       return response.getEntityInputStream();\r
+               } else {\r
+                       return null;\r
+               }\r
+       }\r
+\r
+       @Override\r
+       public String header(String name) {\r
+               return response.getHeaders().getFirst(name);\r
+       }\r
+\r
+       @Override\r
+       public Map<String, String> headers() {\r
+               Map<String, String> headers = new HashMap<String, String>();\r
+               for(String k : response.getHeaders().keySet()) {\r
+                       headers.put(k, response.getHeaders().getFirst(k));\r
+               }\r
+               return headers;\r
+       }\r
+}\r
diff --git a/openstack-client-connectors/jersey-connector/src/main/resources/META-INF/services/com.woorea.openstack.base.client.OpenStackClientConnector b/openstack-client-connectors/jersey-connector/src/main/resources/META-INF/services/com.woorea.openstack.base.client.OpenStackClientConnector
new file mode 100644 (file)
index 0000000..5b9a158
--- /dev/null
@@ -0,0 +1 @@
+com.woorea.openstack.connector.JerseyConnector
\ No newline at end of file
diff --git a/openstack-client-connectors/jersey2-connector/pom.xml b/openstack-client-connectors/jersey2-connector/pom.xml
new file mode 100644 (file)
index 0000000..4cf7e83
--- /dev/null
@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+       <modelVersion>4.0.0</modelVersion>
+       <parent>
+               <groupId>org.openecomp.mso.libs.openstack-java-sdk</groupId>
+               <artifactId>client-connectors</artifactId>
+               <version>1.0.0-SNAPSHOT</version>
+       </parent>
+       <groupId>org.openecomp.mso.libs.openstack-java-sdk.client-connectors</groupId>
+       <artifactId>jersey2-connector</artifactId>
+       <name>OpenStack Jersey2 Connector</name>
+       <description>OpenStack Jersey2 Connector</description>
+       <url>http://maven.apache.org</url>
+       <properties>
+               <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+       </properties>
+       <dependencies>
+               <dependency>
+                       <groupId>org.glassfish.jersey.core</groupId>
+                       <artifactId>jersey-client</artifactId>
+                       <version>2.6</version>
+               </dependency>
+               <dependency>
+                       <groupId>org.glassfish.jersey.media</groupId>
+                       <artifactId>jersey-media-json-jackson</artifactId>
+                       <version>2.6</version>
+               </dependency>
+               <dependency>
+                       <groupId>org.openecomp.mso.libs.openstack-java-sdk</groupId>
+                       <artifactId>openstack-client</artifactId>
+                       <version>1.0.0-SNAPSHOT</version>
+               </dependency>
+       </dependencies>
+       
+</project>
diff --git a/openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/connector/JaxRs20Connector.java b/openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/connector/JaxRs20Connector.java
new file mode 100644 (file)
index 0000000..2171bea
--- /dev/null
@@ -0,0 +1,65 @@
+package com.woorea.openstack.connector;
+
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Logger;
+
+import javax.ws.rs.ClientErrorException;
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.client.Invocation;
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.MediaType;
+
+import org.glassfish.jersey.filter.LoggingFilter;
+
+import com.woorea.openstack.base.client.HttpMethod;
+import com.woorea.openstack.base.client.OpenStackClientConnector;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.base.client.OpenStackResponse;
+import com.woorea.openstack.base.client.OpenStackResponseException;
+
+public class JaxRs20Connector implements OpenStackClientConnector {
+
+       protected Client client = OpenStack.CLIENT;
+    private LoggingFilter logger = new LoggingFilter(Logger.getLogger("os"), 10000);
+
+       @Override
+       public <T> OpenStackResponse request(OpenStackRequest<T> request) {
+               WebTarget target = client.target(request.endpoint()).path(request.path());
+
+               for(Map.Entry<String, List<Object> > entry : request.queryParams().entrySet()) {
+                       for (Object o : entry.getValue()) {
+                               target = target.queryParam(entry.getKey(), o);
+                       }
+               }
+        target.register(logger);
+               Invocation.Builder invocation = target.request();
+
+               for(Map.Entry<String, List<Object>> h : request.headers().entrySet()) {
+                       StringBuilder sb = new StringBuilder();
+                       for(Object v : h.getValue()) {
+                               sb.append(String.valueOf(v));
+                       }
+                       invocation.header(h.getKey(), sb);
+               }
+
+               Entity<?> entity = (request.entity() == null) ? null :
+                               Entity.entity(request.entity().getEntity(), request.entity().getContentType());
+
+               try {
+                       if (entity != null) {
+                               return new JaxRs20Response(invocation.method(request.method().name(), entity));
+                       } else {
+                               if(HttpMethod.PUT == request.method()) {
+                                       return new JaxRs20Response(invocation.method(request.method().name(), Entity.entity("", MediaType.APPLICATION_JSON)));
+                               } else {
+                                       return new JaxRs20Response(invocation.method(request.method().name()));
+                               }
+                       }
+               } catch (ClientErrorException e) {
+                       throw new OpenStackResponseException(e.getResponse()
+                                       .getStatusInfo().toString(), e.getResponse().getStatus());
+               }
+       }
+}
diff --git a/openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/connector/JaxRs20Response.java b/openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/connector/JaxRs20Response.java
new file mode 100644 (file)
index 0000000..f27f337
--- /dev/null
@@ -0,0 +1,61 @@
+package com.woorea.openstack.connector;
+
+/*
+ * Modifications copyright (c) 2017 AT&T Intellectual Property
+ */
+
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.ws.rs.core.Response;
+
+import com.woorea.openstack.base.client.OpenStackResponse;
+import com.woorea.openstack.base.client.OpenStackResponseException;
+
+public class JaxRs20Response implements OpenStackResponse {
+       
+       private Response response;
+       
+       public JaxRs20Response(Response response) {
+               this.response = response;
+       }
+
+       @Override
+       public <T> T getEntity(Class<T> returnType) {
+               if(response.getStatus() >= 400) {
+                       throw new OpenStackResponseException(response.getStatusInfo().getReasonPhrase(),
+                                       response.getStatusInfo().getStatusCode(), this);
+               }
+               return response.readEntity(returnType);
+       }
+
+       @Override
+       public <T> T getErrorEntity(Class<T> returnType) {
+               if(response.getStatus() >= 400 && response.hasEntity()) {
+                       return response.readEntity(returnType);
+               }
+               return null;
+       }
+       
+
+       @Override
+       public InputStream getInputStream() {
+               return (InputStream) response.getEntity();
+       }
+
+       @Override
+       public String header(String name) {
+               return response.getHeaderString(name);
+       }
+
+       @Override
+       public Map<String, String> headers() {
+               Map<String, String> headers = new HashMap<String, String>();
+               for(String k : response.getHeaders().keySet()) {
+                       headers.put(k, response.getHeaderString(k));
+               }
+               return headers;
+       }
+
+}
diff --git a/openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/connector/OpenStack.java b/openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/connector/OpenStack.java
new file mode 100644 (file)
index 0000000..f514cc8
--- /dev/null
@@ -0,0 +1,110 @@
+package com.woorea.openstack.connector;
+
+import java.io.IOException;
+
+import javax.net.ssl.SSLContext;
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.ClientRequestContext;
+import javax.ws.rs.client.ClientRequestFilter;
+import javax.ws.rs.ext.ContextResolver;
+
+import org.codehaus.jackson.map.DeserializationConfig;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.map.SerializationConfig;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
+import org.glassfish.jersey.SslConfigurator;
+import org.glassfish.jersey.jackson.JacksonFeature;
+
+public class OpenStack {
+
+       public static Client CLIENT;
+       
+       public static ObjectMapper DEFAULT_MAPPER;
+       
+       public static ObjectMapper WRAPPED_MAPPER;
+       
+       static {
+               initialize();
+       }
+       
+       private static void initialize() {
+               
+               /*
+               //class MyX509TrustManager implements X509TrustManager
+               TrustManager mytm[] = null;
+        KeyManager mykm[] = null;
+
+        try {
+            mytm = new TrustManager[]{new MyX509TrustManager("./truststore_client", "asdfgh".toCharArray())};
+            mykm = new KeyManager[]{new MyX509KeyManager("./keystore_client", "asdfgh".toCharArray())};
+        } catch (Exception ex) {
+
+        }
+               
+               SSLContext context = null;
+        context = SSLContext.getInstance("SSL");
+        context.init(mykm, mytm, null);
+               
+               */
+               
+               try {
+                       
+                       SSLContext context = null;
+            context = SSLContext.getInstance("SSL");
+            context.init(null, null, null);
+            
+            SslConfigurator sslConfig = SslConfigurator.newInstance();
+                       /*
+                    .trustStoreFile("./truststore_client")
+                    .trustStorePassword("asdfgh")
+
+                    .keyStoreFile("./keystore_client")
+                    .keyPassword("asdfgh");
+                    */
+                       //old: CLIENT.property(ClientProperties.SSL_CONFIG, new SslConfig(context));
+            
+            CLIENT = ClientBuilder.newBuilder().sslContext(sslConfig.createSSLContext()).build();
+                       
+                       DEFAULT_MAPPER = new ObjectMapper();
+                       
+                       DEFAULT_MAPPER.setSerializationInclusion(Inclusion.NON_NULL);
+                       DEFAULT_MAPPER.enable(SerializationConfig.Feature.INDENT_OUTPUT);
+                       DEFAULT_MAPPER.enable(DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
+                       DEFAULT_MAPPER.disable(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES);
+                       DEFAULT_MAPPER.enable(DeserializationConfig.Feature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
+                       
+                       WRAPPED_MAPPER = new ObjectMapper();
+                       
+                       WRAPPED_MAPPER.setSerializationInclusion(Inclusion.NON_NULL);
+                       WRAPPED_MAPPER.enable(SerializationConfig.Feature.INDENT_OUTPUT);
+                       WRAPPED_MAPPER.enable(SerializationConfig.Feature.WRAP_ROOT_VALUE);
+                       WRAPPED_MAPPER.enable(DeserializationConfig.Feature.UNWRAP_ROOT_VALUE);
+                       WRAPPED_MAPPER.enable(DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
+                       WRAPPED_MAPPER.disable(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES);
+                       WRAPPED_MAPPER.enable(DeserializationConfig.Feature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
+                       
+                       CLIENT.register(new JacksonFeature()).register(new ContextResolver<ObjectMapper>() {
+
+                               public ObjectMapper getContext(Class<?> type) {
+                                       return type.getAnnotation(JsonRootName.class) == null ? DEFAULT_MAPPER : WRAPPED_MAPPER;
+                               }
+                               
+                       });
+                       
+                       CLIENT.register(new ClientRequestFilter() {
+                               
+                               public void filter(ClientRequestContext requestContext) throws IOException {
+                                       requestContext.getHeaders().remove("Content-Language");
+                                       requestContext.getHeaders().remove("Content-Encoding");
+                               }
+                       });
+                       
+               } catch(Exception e) {
+                       throw new RuntimeException(e.getMessage(), e);
+               }
+               
+       }
+
+}
diff --git a/openstack-client-connectors/jersey2-connector/src/main/resources/META-INF/services/com.woorea.openstack.base.client.OpenStackClientConnector b/openstack-client-connectors/jersey2-connector/src/main/resources/META-INF/services/com.woorea.openstack.base.client.OpenStackClientConnector
new file mode 100644 (file)
index 0000000..fc24457
--- /dev/null
@@ -0,0 +1 @@
+com.woorea.openstack.connector.JaxRs20Connector
\ No newline at end of file
diff --git a/openstack-client-connectors/pom.xml b/openstack-client-connectors/pom.xml
new file mode 100644 (file)
index 0000000..6db50a8
--- /dev/null
@@ -0,0 +1,60 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+       <modelVersion>4.0.0</modelVersion>
+       <parent>
+               <groupId>org.openecomp.mso.libs</groupId>
+               <artifactId>openstack-java-sdk</artifactId>
+               <version>1.0.0-SNAPSHOT</version>
+       </parent>
+       <groupId>org.openecomp.mso.libs.openstack-java-sdk</groupId>
+       <artifactId>client-connectors</artifactId>
+       <name>OpenStack Client Connectors</name>
+       <description>OpenStack Client Connectors</description>
+       <packaging>pom</packaging>
+       <profiles>
+               <profile>
+                       <id>jersey</id>
+                       <activation>
+                               <activeByDefault>true</activeByDefault>
+                       </activation>
+                       <modules>
+                               <module>jersey-connector</module>
+                       </modules>
+               </profile>
+               <profile>
+                       <id>jersey2</id>
+                       <activation>
+                               <activeByDefault>true</activeByDefault>
+                       </activation>
+                       <modules>
+                               <module>jersey2-connector</module>
+                       </modules>
+               </profile>
+               <profile>
+                       <id>resteasy</id>
+                       <activation>
+                               <activeByDefault>true</activeByDefault>
+                       </activation>
+                       <modules>
+                               <module>resteasy-connector</module>
+                       </modules>
+               </profile>
+               <profile>
+                       <id>http</id>
+                       <activation>
+                               <activeByDefault>true</activeByDefault>
+                       </activation>
+                       <modules>
+                               <module>http-connector</module>
+                       </modules>
+               </profile>
+               
+       </profiles>
+       <dependencies>
+               <dependency>
+                       <groupId>org.openecomp.mso.libs.openstack-java-sdk</groupId>
+                       <artifactId>openstack-client</artifactId>
+                       <version>1.0.0-SNAPSHOT</version>
+               </dependency>
+       </dependencies>
+       
+</project>
\ No newline at end of file
diff --git a/openstack-client-connectors/resteasy-connector/pom.xml b/openstack-client-connectors/resteasy-connector/pom.xml
new file mode 100644 (file)
index 0000000..6cbdd3a
--- /dev/null
@@ -0,0 +1,30 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.openecomp.mso.libs.openstack-java-sdk</groupId>
+    <artifactId>client-connectors</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+  </parent>
+  <groupId>org.openecomp.mso.libs.openstack-java-sdk.client-connectors</groupId>
+  <artifactId>resteasy-connector</artifactId>
+  <name>OpenStack RESTEasy Connector</name>
+  <description>OpenStack RESTEasy Connector</description>
+  <dependencies>
+       <dependency>
+               <groupId>org.jboss.resteasy</groupId>
+               <artifactId>resteasy-jaxrs</artifactId>
+               <version>2.3.2.Final</version>
+       </dependency>
+       <dependency>
+               <groupId>org.codehaus.jackson</groupId>
+               <artifactId>jackson-jaxrs</artifactId>
+               <version>1.9.4</version>
+       </dependency>
+       <dependency>
+               <groupId>commons-httpclient</groupId>
+               <artifactId>commons-httpclient</artifactId>
+               <version>3.1</version>
+       </dependency>
+  </dependencies>
+  
+</project>
\ No newline at end of file
diff --git a/openstack-client-connectors/resteasy-connector/src/main/java/com/woorea/openstack/connector/RESTEasyConnector.java b/openstack-client-connectors/resteasy-connector/src/main/java/com/woorea/openstack/connector/RESTEasyConnector.java
new file mode 100644 (file)
index 0000000..b2ec415
--- /dev/null
@@ -0,0 +1,125 @@
+package com.woorea.openstack.connector;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import javax.ws.rs.core.UriBuilder;
+import javax.ws.rs.ext.ContextResolver;
+
+import org.apache.commons.httpclient.HttpStatus;
+import org.codehaus.jackson.jaxrs.JacksonJsonProvider;
+import org.codehaus.jackson.map.DeserializationConfig;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.map.SerializationConfig;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
+import org.jboss.resteasy.client.ClientRequest;
+import org.jboss.resteasy.client.ClientResponse;
+import org.jboss.resteasy.plugins.providers.InputStreamProvider;
+import org.jboss.resteasy.spi.ResteasyProviderFactory;
+
+import com.woorea.openstack.base.client.OpenStackClientConnector;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.base.client.OpenStackResponse;
+import com.woorea.openstack.base.client.OpenStackResponseException;
+
+public class RESTEasyConnector implements OpenStackClientConnector {
+
+       public static ObjectMapper DEFAULT_MAPPER;
+
+       public static ObjectMapper WRAPPED_MAPPER;
+
+       static class OpenStackProviderFactory extends ResteasyProviderFactory {
+
+               private JacksonJsonProvider jsonProvider;
+               private InputStreamProvider streamProvider;
+
+               public OpenStackProviderFactory() {
+                       super();
+
+                       addContextResolver(new ContextResolver<ObjectMapper>() {
+                               public ObjectMapper getContext(Class<?> type) {
+                                       return type.getAnnotation(JsonRootName.class) == null ? DEFAULT_MAPPER : WRAPPED_MAPPER;
+                               }
+                       });
+
+                       jsonProvider = new JacksonJsonProvider();
+                       addMessageBodyReader(jsonProvider);
+                       addMessageBodyWriter(jsonProvider);
+
+                       streamProvider = new InputStreamProvider();
+                       addMessageBodyReader(streamProvider);
+                       addMessageBodyWriter(streamProvider);
+               }
+
+       }
+
+       private static OpenStackProviderFactory providerFactory;
+
+       static {
+               DEFAULT_MAPPER = new ObjectMapper();
+
+               DEFAULT_MAPPER.setSerializationInclusion(Inclusion.NON_NULL);
+               DEFAULT_MAPPER.enable(SerializationConfig.Feature.INDENT_OUTPUT);
+               DEFAULT_MAPPER.enable(DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
+               DEFAULT_MAPPER.disable(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES);
+               DEFAULT_MAPPER.enable(DeserializationConfig.Feature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
+
+               WRAPPED_MAPPER = new ObjectMapper();
+
+               WRAPPED_MAPPER.setSerializationInclusion(Inclusion.NON_NULL);
+               WRAPPED_MAPPER.enable(SerializationConfig.Feature.INDENT_OUTPUT);
+               WRAPPED_MAPPER.enable(SerializationConfig.Feature.WRAP_ROOT_VALUE);
+               WRAPPED_MAPPER.enable(DeserializationConfig.Feature.UNWRAP_ROOT_VALUE);
+               WRAPPED_MAPPER.enable(DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
+               WRAPPED_MAPPER.disable(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES);
+               WRAPPED_MAPPER.enable(DeserializationConfig.Feature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
+
+               providerFactory = new OpenStackProviderFactory();
+       }
+
+       public <T> OpenStackResponse request(OpenStackRequest<T> request) {
+               ClientRequest client = new ClientRequest(UriBuilder.fromUri(request.endpoint() + "/" + request.path()),
+                               ClientRequest.getDefaultExecutor(), providerFactory);
+
+               for(Map.Entry<String, List<Object> > entry : request.queryParams().entrySet()) {
+                       for (Object o : entry.getValue()) {
+                               client = client.queryParameter(entry.getKey(), String.valueOf(o));
+                       }
+               }
+
+               for (Entry<String, List<Object>> h : request.headers().entrySet()) {
+                       StringBuilder sb = new StringBuilder();
+                       for (Object v : h.getValue()) {
+                               sb.append(String.valueOf(v));
+                       }
+                       client.header(h.getKey(), sb);
+               }
+
+               if (request.entity() != null) {
+                       client.body(request.entity().getContentType(), request.entity().getEntity());
+               }
+
+               ClientResponse<T> response;
+
+               try {
+                       response = client.httpMethod(request.method().name(), request.returnType());
+               } catch (Exception e) {
+                       throw new RuntimeException("Unexpected client exception", e);
+               }
+
+               if (response.getStatus() == HttpStatus.SC_OK
+                               || response.getStatus() == HttpStatus.SC_CREATED
+                               || response.getStatus() == HttpStatus.SC_NO_CONTENT
+                               || response.getStatus() == HttpStatus.SC_ACCEPTED) {
+                       return new RESTEasyResponse(client, response);
+               }
+
+               response.releaseConnection();
+
+               throw new OpenStackResponseException(response.getResponseStatus()
+                               .getReasonPhrase(), response.getStatus());
+       }
+
+}
diff --git a/openstack-client-connectors/resteasy-connector/src/main/java/com/woorea/openstack/connector/RESTEasyInputStream.java b/openstack-client-connectors/resteasy-connector/src/main/java/com/woorea/openstack/connector/RESTEasyInputStream.java
new file mode 100644 (file)
index 0000000..913a500
--- /dev/null
@@ -0,0 +1,37 @@
+package com.woorea.openstack.connector;
+
+import java.io.FilterInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.SocketException;
+
+import org.jboss.resteasy.client.ClientExecutor;
+
+
+public class RESTEasyInputStream extends FilterInputStream {
+
+       protected ClientExecutor clientExecutor;
+
+       public RESTEasyInputStream(InputStream inputStream, ClientExecutor clientExecutor) {
+               super(inputStream);
+               this.clientExecutor = clientExecutor;
+       }
+
+       @Override
+       public void close() throws IOException {
+               try {
+                       clientExecutor.close();
+               } catch (Exception e) {
+                       // Silently skip errors in the socket close errors
+               }
+
+               try {
+                       super.close();
+               } catch (SocketException e) {
+                       // We expect this exception because the socket is closed
+               } catch (IllegalStateException e) {
+                       // We expect this exception because the socket is closed (httpclient 4.2)
+               }
+       }
+
+}
diff --git a/openstack-client-connectors/resteasy-connector/src/main/java/com/woorea/openstack/connector/RESTEasyResponse.java b/openstack-client-connectors/resteasy-connector/src/main/java/com/woorea/openstack/connector/RESTEasyResponse.java
new file mode 100644 (file)
index 0000000..82e3187
--- /dev/null
@@ -0,0 +1,59 @@
+package com.woorea.openstack.connector;
+
+/*
+ * Modifications copyright (c) 2017 AT&T Intellectual Property
+ */
+
+import org.jboss.resteasy.client.ClientRequest;
+import org.jboss.resteasy.client.ClientResponse;
+import com.woorea.openstack.base.client.OpenStackResponse;
+
+import javax.ws.rs.core.MultivaluedMap;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+public class RESTEasyResponse implements OpenStackResponse {
+
+    private ClientRequest client;
+
+    private ClientResponse response;
+
+    public RESTEasyResponse(ClientRequest client, ClientResponse response) {
+        this.client = client;
+        this.response = response;
+    }
+
+    @Override
+    public <T> T getEntity(Class<T> returnType) {
+        return (T) response.getEntity(returnType);
+    }
+
+    @Override
+    public <T> T getErrorEntity(Class<T> returnType) {
+        return (T) response.getEntity(returnType);
+    }
+
+    @Override
+    public InputStream getInputStream() {
+               return new RESTEasyInputStream((InputStream) response.getEntity(InputStream.class), client.getExecutor());
+    }
+
+    @Override
+    public String header(String name) {
+        return response.getHeaders().getFirst(name).toString();
+    }
+
+    @Override
+    public Map<String, String> headers() {
+        Map<String, String> headers = new HashMap<String, String>();
+        MultivaluedMap<String, Object> responseHeaders = response.getHeaders();
+
+        for (String key : responseHeaders.keySet()) {
+            headers.put(key, responseHeaders.getFirst(key).toString());
+        }
+
+        return headers;
+    }
+
+}
diff --git a/openstack-client-connectors/resteasy-connector/src/main/resources/META-INF/services/com.woorea.openstack.base.client.OpenStackClientConnector b/openstack-client-connectors/resteasy-connector/src/main/resources/META-INF/services/com.woorea.openstack.base.client.OpenStackClientConnector
new file mode 100644 (file)
index 0000000..dbb991d
--- /dev/null
@@ -0,0 +1 @@
+com.woorea.openstack.connector.RESTEasyConnector
\ No newline at end of file
diff --git a/openstack-client/pom.xml b/openstack-client/pom.xml
new file mode 100644 (file)
index 0000000..ac668b0
--- /dev/null
@@ -0,0 +1,12 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+       <modelVersion>4.0.0</modelVersion>
+       <parent>
+               <groupId>org.openecomp.mso.libs</groupId>
+               <artifactId>openstack-java-sdk</artifactId>
+               <version>1.0.0-SNAPSHOT</version>
+       </parent>
+       <groupId>org.openecomp.mso.libs.openstack-java-sdk</groupId>
+       <artifactId>openstack-client</artifactId>
+       <name>OpenStack Client</name>
+       <description>OpenStack Client</description>
+</project>
\ No newline at end of file
diff --git a/openstack-client/src/main/java/com/woorea/openstack/base/client/Entity.java b/openstack-client/src/main/java/com/woorea/openstack/base/client/Entity.java
new file mode 100644 (file)
index 0000000..42eb5fd
--- /dev/null
@@ -0,0 +1,54 @@
+package com.woorea.openstack.base.client;
+
+import java.io.InputStream;
+
+
+public class Entity<T> {
+       
+       private T entity;
+       
+       private String contentType;
+       
+       public static <T> Entity<T> json(T entity) {
+               return new Entity<T>(entity, "application/json");
+       }
+       
+       public static <T> Entity<T> stream(T entity) {
+               return new Entity<T>(entity, "application/octet-stream");
+       }
+
+       public Entity(T entity, String contentType) {
+               super();
+               this.entity = entity;
+               this.contentType = contentType;
+       }
+
+       /**
+        * @return the entity
+        */
+       public T getEntity() {
+               return entity;
+       }
+
+       /**
+        * @param entity the entity to set
+        */
+       public void setEntity(T entity) {
+               this.entity = entity;
+       }
+
+       /**
+        * @return the contentType
+        */
+       public String getContentType() {
+               return contentType;
+       }
+
+       /**
+        * @param contentType the contentType to set
+        */
+       public void setContentType(String contentType) {
+               this.contentType = contentType;
+       }
+       
+}
diff --git a/openstack-client/src/main/java/com/woorea/openstack/base/client/HttpMethod.java b/openstack-client/src/main/java/com/woorea/openstack/base/client/HttpMethod.java
new file mode 100644 (file)
index 0000000..6c62ffb
--- /dev/null
@@ -0,0 +1,5 @@
+package com.woorea.openstack.base.client;
+
+public enum HttpMethod {
+       HEAD, GET, POST, PUT, PATCH, DELETE, OPTIONS, TRACE
+}
diff --git a/openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackBaseException.java b/openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackBaseException.java
new file mode 100644 (file)
index 0000000..1827ae1
--- /dev/null
@@ -0,0 +1,46 @@
+/*\r
+ * ============LICENSE_START==========================================\r
+ * ===================================================================\r
+ * Copyright Â© 2017 AT&T Intellectual Property. All rights reserved.\r
+ * ===================================================================\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *        http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ * ============LICENSE_END============================================\r
+ *\r
+ * ECOMP and OpenECOMP are trademarks\r
+ * and service marks of AT&T Intellectual Property.\r
+ *\r
+ */\r
+\r
+package com.woorea.openstack.base.client;\r
+\r
+/**\r
+ * A common abstract parent of all Openstack Exception types, allowing\r
+ * calling classes the choice to catch all error exceptions together.\r
+ */\r
+public abstract class OpenStackBaseException extends RuntimeException\r
+{\r
+       private static final long serialVersionUID = 1L;\r
+\r
+       /*\r
+        * Implement only the basic constructors\r
+        */\r
+       public OpenStackBaseException () {}\r
+       \r
+       public OpenStackBaseException(String message) {\r
+               super(message);\r
+       }\r
+\r
+       public OpenStackBaseException(String message, Throwable cause) {\r
+               super(message, cause);\r
+       }\r
+}\r
diff --git a/openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackClient.java b/openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackClient.java
new file mode 100644 (file)
index 0000000..57a6628
--- /dev/null
@@ -0,0 +1,90 @@
+package com.woorea.openstack.base.client;
+
+/*
+ * Modifications copyright (c) 2017 AT&T Intellectual Property
+ */
+
+import java.util.Properties;
+import java.util.ServiceLoader;
+
+public class OpenStackClient {
+       
+       protected String endpoint;
+       
+       protected OpenStackTokenProvider tokenProvider;
+
+       protected static int AUTHENTICATION_RETRIES = 1;
+
+       protected OpenStackClientConnector connector;
+       
+       protected Properties properties = new Properties();
+       
+       protected static OpenStackClientConnector DEFAULT_CONNECTOR;
+
+       static {
+               ServiceLoader<OpenStackClientConnector> connectorLoader;
+               connectorLoader = ServiceLoader.load(OpenStackClientConnector.class);
+
+               for (OpenStackClientConnector clientConnector : connectorLoader) {
+                       DEFAULT_CONNECTOR = clientConnector;
+                       break;
+               }
+       }
+
+       public OpenStackClient(String endpoint) {
+               this.endpoint = endpoint;
+               this.connector = DEFAULT_CONNECTOR;
+       }
+
+       public OpenStackClient(String endpoint, OpenStackClientConnector connector) {
+               this.endpoint = endpoint;
+               this.connector = (connector == null) ? DEFAULT_CONNECTOR : connector;
+       }
+
+       public <T> OpenStackResponse request(OpenStackRequest<T> request) {
+               OpenStackResponseException authException = null;
+               System.out.println("Openstack query:"+request.toString());
+               for (int i = 0; i <= AUTHENTICATION_RETRIES; i++) {
+                       request.endpoint(endpoint);
+
+                       if (tokenProvider != null) {
+                               request.header("X-Auth-Token", tokenProvider.getToken());
+                       }
+
+                       try {
+                               return connector.request(request);
+                       } catch (OpenStackResponseException e) {
+                               if (e.getStatus() != OpenStackResponseStatus.NOT_AUTHORIZED
+                                               || tokenProvider == null) {
+                                       throw e;
+                               }
+                               authException = e;
+                               tokenProvider.expireToken();
+                       }
+               }
+
+               throw authException;
+       }
+
+       public <T> T execute(OpenStackRequest<T> request) {
+               OpenStackResponse response =  request(request);
+               return (request.returnType() != null && request.returnType() != Void.class) ? response.getEntity(request.returnType()) : null;
+       }
+
+       public void property(String property, String value) {
+               properties.put(property, value);
+       }
+       
+       public void setTokenProvider(OpenStackTokenProvider tokenProvider) {
+               this.tokenProvider = tokenProvider;
+       }
+       
+       public void token(String token) {
+               setTokenProvider(new OpenStackSimpleTokenProvider(token));
+       }
+       
+       public <R> OpenStackRequest<R> get(String path, Class<R> returnType) {
+               return new OpenStackRequest<R>(this, HttpMethod.GET, path, null, returnType);
+       }
+       
+}
diff --git a/openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackClientConnector.java b/openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackClientConnector.java
new file mode 100644 (file)
index 0000000..417b844
--- /dev/null
@@ -0,0 +1,8 @@
+package com.woorea.openstack.base.client;
+
+
+public interface OpenStackClientConnector {
+
+       public <T> OpenStackResponse request(OpenStackRequest<T> request);
+
+}
diff --git a/openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackCommand.java b/openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackCommand.java
new file mode 100644 (file)
index 0000000..5ef291f
--- /dev/null
@@ -0,0 +1,8 @@
+package com.woorea.openstack.base.client;
+//package org.openstack.base.client;
+//
+//public interface OpenStackCommand<R> {
+//
+//     OpenStackRequest createRequest(OpenStackClient connector);
+//
+//}
diff --git a/openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackConnectException.java b/openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackConnectException.java
new file mode 100644 (file)
index 0000000..aabcd1f
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * ============LICENSE_START==========================================
+ * ===================================================================
+ * Copyright Â© 2017 AT&T Intellectual Property. All rights reserved.
+ * ===================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ *
+ */
+
+package com.woorea.openstack.base.client;
+
+/**
+ * Custom RuntimeException to report connection errors to Openstack endpoints.
+ * Must be a RuntimeException to conform with OpenstackClient interface, which
+ * does not declare specific Exceptions.
+ */
+public class OpenStackConnectException extends OpenStackBaseException {
+
+       private static final long serialVersionUID = 7294957362769575271L;
+
+       public OpenStackConnectException(String message) {
+               super(message);
+       }
+
+       public OpenStackConnectException(String message, Throwable cause) {
+               super(message, cause);
+       }
+}
diff --git a/openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackRequest.java b/openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackRequest.java
new file mode 100644 (file)
index 0000000..94a545f
--- /dev/null
@@ -0,0 +1,142 @@
+package com.woorea.openstack.base.client;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Map;
+
+public class OpenStackRequest<R> {
+       
+       private OpenStackClient client;
+       
+       public OpenStackRequest() {
+               
+       }
+       
+       public OpenStackRequest(OpenStackClient client, HttpMethod method, CharSequence path, Entity<?> entity, Class<R> returnType) {
+               this.client = client;
+               this.method = method;
+               this.path = new StringBuilder(path);
+               this.entity = entity;
+               this.returnType = returnType;
+               header("Accept", "application/json");
+       }
+       
+       private String endpoint;
+       
+       private HttpMethod method;
+       
+       private StringBuilder path = new StringBuilder();
+       
+       private Map<String, List<Object>> headers = new HashMap<String, List<Object>>();
+       
+       private Entity<?> entity;
+       
+       private Class<R> returnType;
+       
+       public OpenStackRequest<R> endpoint(String endpoint) {
+               this.endpoint = endpoint;
+               return this;
+       }
+       
+       public String endpoint() {
+               return endpoint;
+       }
+
+       public OpenStackRequest<R> method(HttpMethod method) {
+               this.method = method;
+               return this;
+       }
+       
+       public HttpMethod method() {
+               return method;
+       }
+       
+       public OpenStackRequest<R> path(String path) {
+               this.path.append(path);
+               return this;
+       }
+       
+       public String path() {
+               return path.toString();
+       }
+
+       public OpenStackRequest<R> header(String name, Object value) {
+               if(value != null) {
+                       headers.put(name, Arrays.asList(value));
+               }
+               return this;
+       }
+       
+       public Map<String, List<Object>> headers() {
+               return headers;
+       }
+       
+       public <T> Entity<T> entity(T entity, String contentType) {
+               return new Entity<T>(entity, contentType);
+       }
+       
+       public Entity<?> entity() {
+               return entity;
+       }
+       
+       public <T> Entity<T> json(T entity) {
+               return entity(entity, "application/json");
+       }
+       
+       public void returnType(Class<R> returnType) {
+               this.returnType = returnType;
+       }
+       
+       public Class<R> returnType() {
+               return returnType;
+       }
+       
+       public R execute() {
+               return client.execute(this);
+       }
+       
+       public OpenStackResponse request() {
+               return client.request(this);
+       }
+
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "OpenStackRequest [endpoint=" + endpoint + ", method=" + method
+                               + ", path=" + path + ", headers=" + headers + ", entity="
+                               + entity + ", returnType=" + returnType + "]";
+       }
+
+       private Map<String, List<Object> > queryParams = new LinkedHashMap<String, List<Object> >();
+
+       public Map<String, List<Object> > queryParams() {
+               return queryParams;
+       }
+
+       public OpenStackRequest<R> queryParam(String key, Object value) {
+               if (queryParams.containsKey(key)) {
+                       List<Object> values = queryParams.get(key);
+                       values.add(value);
+               } else {
+                       List<Object> values = new ArrayList<Object>();
+                       values.add(value);
+                       queryParams.put(key, values);
+               }
+
+               return this;
+    }
+       
+       protected static String buildPath(String ... elements) {
+           StringBuilder stringBuilder = new StringBuilder();
+           for (String element : elements) {
+            stringBuilder.append(element);
+        }
+
+           return stringBuilder.toString();
+       }
+}
diff --git a/openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackResponse.java b/openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackResponse.java
new file mode 100644 (file)
index 0000000..1e09320
--- /dev/null
@@ -0,0 +1,22 @@
+package com.woorea.openstack.base.client;
+
+/*
+ * Modifications copyright (c) 2017 AT&T Intellectual Property
+ */
+
+import java.io.InputStream;
+import java.util.Map;
+
+public interface OpenStackResponse {
+
+       public <T> T getEntity(Class<T> returnType);
+
+       public <T> T getErrorEntity(Class<T> returnType);
+
+       public InputStream getInputStream();
+
+       public String header(String name);
+       
+       public Map<String, String> headers();
+       
+}
diff --git a/openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackResponseException.java b/openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackResponseException.java
new file mode 100644 (file)
index 0000000..355c300
--- /dev/null
@@ -0,0 +1,42 @@
+package com.woorea.openstack.base.client;
+
+/*
+ * Modifications copyright (c) 2017 AT&T Intellectual Property
+ */
+
+public class OpenStackResponseException extends OpenStackBaseException {
+
+       private static final long serialVersionUID = 7294957362769575271L;
+
+       protected String message;
+
+       protected int status;
+       
+       // Make the response available for exception handling (includes body)
+       protected OpenStackResponse response;
+
+       public OpenStackResponseException(String message, int status) {
+               this.message = message;
+               this.status = status;
+               this.response = null;
+       }
+
+       public OpenStackResponseException(String message, int status, OpenStackResponse response) {
+               this.message = message;
+               this.status = status;
+               this.response = response;
+       }
+
+       public String getMessage() {
+               return message;
+       }
+
+       public int getStatus() {
+               return status;
+       }
+
+       public OpenStackResponse getResponse() {
+               return response;
+       }
+
+}
diff --git a/openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackResponseStatus.java b/openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackResponseStatus.java
new file mode 100644 (file)
index 0000000..032a511
--- /dev/null
@@ -0,0 +1,11 @@
+package com.woorea.openstack.base.client;
+
+public class OpenStackResponseStatus {
+
+       public static final int OK = 200;
+
+       public static final int NOT_AUTHORIZED = 401;
+
+       public static final int CONFLICT = 409;
+
+}
diff --git a/openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackSimpleTokenProvider.java b/openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackSimpleTokenProvider.java
new file mode 100644 (file)
index 0000000..5ea8d76
--- /dev/null
@@ -0,0 +1,20 @@
+package com.woorea.openstack.base.client;
+
+public class OpenStackSimpleTokenProvider implements OpenStackTokenProvider {
+
+       String token;
+
+       public OpenStackSimpleTokenProvider(String token) {
+               this.token = token;
+       }
+
+       @Override
+       public String getToken() {
+               return this.token;
+       }
+
+       @Override
+       public void expireToken() {
+       }
+
+}
diff --git a/openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackTokenProvider.java b/openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackTokenProvider.java
new file mode 100644 (file)
index 0000000..0a8f1bf
--- /dev/null
@@ -0,0 +1,9 @@
+package com.woorea.openstack.base.client;
+
+public interface OpenStackTokenProvider {
+
+       String getToken();
+
+       void expireToken();
+
+}
diff --git a/openstack-client/src/main/java/com/woorea/openstack/common/client/AbstractOpenStackClient.java b/openstack-client/src/main/java/com/woorea/openstack/common/client/AbstractOpenStackClient.java
new file mode 100644 (file)
index 0000000..e48ec0b
--- /dev/null
@@ -0,0 +1,125 @@
+package com.woorea.openstack.common.client;
+//package org.openstack.common.client;
+//
+//import java.io.IOException;
+//import java.util.logging.Logger;
+//
+//import javax.ws.rs.client.ClientRequestContext;
+//import javax.ws.rs.client.ClientRequestFilter;
+//import javax.ws.rs.client.Entity;
+//import javax.ws.rs.client.Invocation.Builder;
+//import javax.ws.rs.client.WebTarget;
+//import javax.ws.rs.core.MediaType;
+//
+//import org.glassfish.jersey.filter.LoggingFilter;
+//import org.openstack.connector.OpenStack;
+//
+//public class AbstractOpenStackClient {
+//
+//     protected String endpointURL;
+//     
+//     protected String token;
+//     
+//     protected LoggingFilter loggingFilter;
+//     
+//     protected ClientRequestFilter tokenFilter = new ClientRequestFilter() {
+//             
+//             @Override
+//             public void filter(ClientRequestContext requestContext) throws IOException {
+//                     requestContext.getHeaders().putSingle("X-Auth-Token", token);
+//             }
+//     };
+//
+//     public AbstractOpenStackClient(String endpointURL, String token) {
+//             this.endpointURL = endpointURL;
+//             this.token = token;
+//     }
+//     
+//     public AbstractOpenStackClient(String endpointURL) {
+//             this(endpointURL, null);
+//     }
+//
+//     /**
+//      * @param token the token to set
+//      */
+//     public void setToken(String token) {
+//             this.token = token;
+//     }
+//     
+//     public OpenStackRequest request(String uri, String... mediaTypes) {
+//             WebTarget endpoint = OpenStack.CLIENT.target(endpointURL);
+//             if(token != null) {
+//                     endpoint.register(tokenFilter);
+//             }
+//             return new OpenStackRequest(endpoint.path(uri).request(mediaTypes));
+//     }
+//     
+//     public OpenStackRequest request(String uri) {
+//             return request(uri, MediaType.APPLICATION_JSON);
+//     }
+//     
+//     protected WebTarget create(String endpoint) {
+//             WebTarget target = OpenStack.CLIENT.target(endpoint);
+//             if(loggingFilter != null) {
+//                     target.register(loggingFilter);
+//             }
+//             if(token != null) {
+//                     target.register(tokenFilter);
+//             }
+//             return target;
+//     }
+//     
+//     public void enableLogging(Logger logger, int entitySize) {
+//             loggingFilter = new LoggingFilter(logger, entitySize);
+//     }
+//     
+//     public void disableLogging() {
+//             loggingFilter = null;
+//     }
+//     
+//     public static class OpenStackRequest {
+//             
+//             private Builder builder;
+//             
+//             private OpenStackRequest(Builder builder) {
+//                     this.builder = builder;
+//             }
+//             
+//             public <ResponseType> ResponseType execute(String method, Class<ResponseType> type) {
+//                     return builder.method(method, type);
+//             }
+//             
+//             public <RequestType, ResponseType> ResponseType execute(String method, Entity<RequestType> data, Class<ResponseType> type) {
+//                     return builder.method(method, data, type);
+//             }
+//             
+//             public void execute(String method) {
+//                     builder.method(method);
+//             }
+//             
+//             public <RequestType> void execute(String method, Entity<RequestType> data) {
+//                     builder.method(method, data, Void.class);
+//             }
+//             
+//             public <ResponseType> ResponseType get(Class<ResponseType> type) {
+//                     return execute("GET", type);
+//             }
+//             
+//             public <ResponseType> ResponseType postJson(Object data, Class<ResponseType> type) {
+//                     return execute("POST", Entity.json(data), type);
+//             }
+//             
+//             public <ResponseType> ResponseType putJson(Object data, Class<ResponseType> type) {
+//                     return execute("PUT", Entity.json(data), type);
+//             }
+//             
+//             public <ResponseType> ResponseType patchJson(Object data, Class<ResponseType> type) {
+//                     return execute("PATCH", Entity.json(data), type);
+//             }
+//             
+//             public void delete() {
+//                     execute("DELETE", Void.class);
+//             }
+//     }
+//
+//}
diff --git a/openstack-client/src/main/java/com/woorea/openstack/common/session/OpenStackSession.java b/openstack-client/src/main/java/com/woorea/openstack/common/session/OpenStackSession.java
new file mode 100644 (file)
index 0000000..a56a3af
--- /dev/null
@@ -0,0 +1,107 @@
+package com.woorea.openstack.common.session;
+//package org.openstack.common.session;
+//
+//import java.io.Serializable;
+//
+//import org.openstack.keystone.model.Access;
+//import org.openstack.keystone.model.Authentication;
+//
+//public class OpenStackSession implements Serializable {
+//     
+//     private String authenticationURL;
+//     
+//     private Authentication authentication;
+//     
+//     private String identityAdministrationURL;
+//     
+//     private String identityAdministrationToken;
+//     
+//     private Access access;
+//     
+//     private boolean admin;
+//
+//     /**
+//      * @return the authenticationURL
+//      */
+//     public String getAuthenticationURL() {
+//             return authenticationURL;
+//     }
+//
+//     /**
+//      * @param authenticationURL the authenticationURL to set
+//      */
+//     public void setAuthenticationURL(String authenticationURL) {
+//             this.authenticationURL = authenticationURL;
+//     }
+//
+//     /**
+//      * @return the authentication
+//      */
+//     public Authentication getAuthentication() {
+//             return authentication;
+//     }
+//
+//     /**
+//      * @param authentication the authentication to set
+//      */
+//     public void setAuthentication(Authentication authentication) {
+//             this.authentication = authentication;
+//     }
+//
+//     /**
+//      * @return the identityAdministrationURL
+//      */
+//     public String getIdentityAdministrationURL() {
+//             return identityAdministrationURL;
+//     }
+//
+//     /**
+//      * @param identityAdministrationURL the identityAdministrationURL to set
+//      */
+//     public void setIdentityAdministrationURL(String identityAdministrationURL) {
+//             this.identityAdministrationURL = identityAdministrationURL;
+//     }
+//
+//     /**
+//      * @return the identityAdministrationToken
+//      */
+//     public String getIdentityAdministrationToken() {
+//             return identityAdministrationToken;
+//     }
+//
+//     /**
+//      * @param identityAdministrationToken the identityAdministrationToken to set
+//      */
+//     public void setIdentityAdministrationToken(String identityAdministrationToken) {
+//             this.identityAdministrationToken = identityAdministrationToken;
+//     }
+//
+//     /**
+//      * @return the access
+//      */
+//     public Access getAccess() {
+//             return access;
+//     }
+//
+//     /**
+//      * @param access the access to set
+//      */
+//     public void setAccess(Access access) {
+//             this.access = access;
+//     }
+//
+//     /**
+//      * @return the admin
+//      */
+//     public boolean isAdmin() {
+//             return admin;
+//     }
+//
+//     /**
+//      * @param admin the admin to set
+//      */
+//     public void setAdmin(boolean admin) {
+//             this.admin = admin;
+//     }
+//
+//}
diff --git a/openstack-client/src/main/java/com/woorea/openstack/common/session/OpenStackSessionHolder.java b/openstack-client/src/main/java/com/woorea/openstack/common/session/OpenStackSessionHolder.java
new file mode 100644 (file)
index 0000000..ea81f7c
--- /dev/null
@@ -0,0 +1,16 @@
+package com.woorea.openstack.common.session;
+//package org.openstack.common.session;
+//
+//public class OpenStackSessionHolder {
+//
+//     private static final ThreadLocal<OpenStackSession> HOLDER = new ThreadLocal<OpenStackSession>();
+//     
+//     public static OpenStackSession getSession() {
+//             return HOLDER.get();
+//     }
+//     
+//     public static void setSession(OpenStackSession session) {
+//             HOLDER.set(session);
+//     }
+//
+//}
diff --git a/openstack-console/pom.xml b/openstack-console/pom.xml
new file mode 100644 (file)
index 0000000..2990671
--- /dev/null
@@ -0,0 +1,78 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+       <modelVersion>4.0.0</modelVersion>
+       <parent>
+               <groupId>org.openecomp.mso</groupId>
+               <artifactId>openstack-java-sdk</artifactId>
+               <version>1.0.0-SNAPSHOT</version>
+       </parent>
+        <groupId>org.openecomp.mso.libs.openstack-java-sdk</groupId>
+       <artifactId>openstack-console</artifactId>
+       <name>OpenStack Console</name>
+       <description>OpenStack Console</description>
+       <dependencies>
+               <dependency>
+                       <groupId>commons-cli</groupId>
+                       <artifactId>commons-cli</artifactId>
+                       <version>1.2</version>
+               </dependency>
+               <dependency>
+                       <groupId>jline</groupId>
+                       <artifactId>jline</artifactId>
+                       <version>2.10</version>
+               </dependency>
+               <dependency>
+                       <groupId>org.openecomp.mso</groupId>
+                       <artifactId>keystone-client</artifactId>
+                       <version>1.0.0-SNAPSHOT</version>
+               </dependency>
+               <dependency>
+                       <groupId>org.openecomp.mso</groupId>
+                       <artifactId>nova-client</artifactId>
+                       <version>1.0.0-SNAPSHOT</version>
+               </dependency>
+       </dependencies>
+       <profiles>
+               <profile>
+                       <id>jersey</id>
+                       <dependencies>
+                               <dependency>
+                                       <groupId>org.openecomp.mso</groupId>
+                                       <artifactId>jersey-connector</artifactId>
+                                       <version>3.0.0-SNAPSHOT</version>
+                               </dependency>
+                       </dependencies>
+               </profile>
+               <profile>
+                       <id>jersey2</id>
+                       <dependencies>
+                               <dependency>
+                                       <groupId>org.openecomp.mso</groupId>
+                                       <artifactId>jersey2-connector</artifactId>
+                                       <version>3.0.0-SNAPSHOT</version>
+                               </dependency>
+                       </dependencies>
+               </profile>
+               <profile>
+                       <id>resteasy</id>
+                       <dependencies>
+                               <dependency>
+                                       <groupId>org.openecomp.mso</groupId>
+                                       <artifactId>resteasy-connector</artifactId>
+                                       <version>3.0.0-SNAPSHOT</version>
+                               </dependency>
+                       </dependencies>
+               </profile>
+       </profiles>
+       <build>
+               <plugins>
+                       <plugin>
+                               <groupId>org.codehaus.mojo</groupId>
+                               <artifactId>exec-maven-plugin</artifactId>
+                               <version>1.2.1</version>
+                               <configuration>
+                                       <mainClass>org.openecomp.mso.openstack.console.Main</mainClass>
+                               </configuration>
+                       </plugin>
+               </plugins>
+       </build>
+</project>
\ No newline at end of file
diff --git a/openstack-console/src/main/java/com/woorea/openstack/console/Command.java b/openstack-console/src/main/java/com/woorea/openstack/console/Command.java
new file mode 100644 (file)
index 0000000..4c96e25
--- /dev/null
@@ -0,0 +1,21 @@
+package com.woorea.openstack.console;
+
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.Options;
+
+
+public abstract class Command {
+       
+       protected String name;
+       
+       public Command(String name) {
+               this.name = name;
+       }
+
+       public abstract void execute(Console console, CommandLine args);
+       
+       public Options getOptions() {
+               return new Options();
+       }
+
+}
diff --git a/openstack-console/src/main/java/com/woorea/openstack/console/CommandLineHelper.java b/openstack-console/src/main/java/com/woorea/openstack/console/CommandLineHelper.java
new file mode 100644 (file)
index 0000000..6e148ce
--- /dev/null
@@ -0,0 +1,71 @@
+package com.woorea.openstack.console;
+
+import java.util.StringTokenizer;
+import java.util.Vector;
+
+public class CommandLineHelper {
+
+       public static String[] parse(String input) {
+        if (input == null || input.length() == 0) {
+            //no command? no string
+            return new String[0];
+        }
+        // parse with a simple finite state machine
+
+        final int normal = 0;
+        final int inQuote = 1;
+        final int inDoubleQuote = 2;
+        int state = normal;
+        StringTokenizer tok = new StringTokenizer(input, "\"\' ", true);
+        Vector v = new Vector();
+        StringBuffer current = new StringBuffer();
+        boolean lastTokenHasBeenQuoted = false;
+
+        while (tok.hasMoreTokens()) {
+            String nextTok = tok.nextToken();
+            switch (state) {
+            case inQuote:
+                if ("\'".equals(nextTok)) {
+                    lastTokenHasBeenQuoted = true;
+                    state = normal;
+                } else {
+                    current.append(nextTok);
+                }
+                break;
+            case inDoubleQuote:
+                if ("\"".equals(nextTok)) {
+                    lastTokenHasBeenQuoted = true;
+                    state = normal;
+                } else {
+                    current.append(nextTok);
+                }
+                break;
+            default:
+                if ("\'".equals(nextTok)) {
+                    state = inQuote;
+                } else if ("\"".equals(nextTok)) {
+                    state = inDoubleQuote;
+                } else if (" ".equals(nextTok)) {
+                    if (lastTokenHasBeenQuoted || current.length() != 0) {
+                        v.addElement(current.toString());
+                        current = new StringBuffer();
+                    }
+                } else {
+                    current.append(nextTok);
+                }
+                lastTokenHasBeenQuoted = false;
+                break;
+            }
+        }
+        if (lastTokenHasBeenQuoted || current.length() != 0) {
+            v.addElement(current.toString());
+        }
+        if (state == inQuote || state == inDoubleQuote) {
+            throw new RuntimeException("unbalanced quotes in " + input);
+        }
+        String[] args = new String[v.size()];
+        v.copyInto(args);
+        return args;
+    }
+
+}
diff --git a/openstack-console/src/main/java/com/woorea/openstack/console/Commands.java b/openstack-console/src/main/java/com/woorea/openstack/console/Commands.java
new file mode 100644 (file)
index 0000000..e8b39dc
--- /dev/null
@@ -0,0 +1,31 @@
+package com.woorea.openstack.console;
+
+import java.util.Map;
+
+import org.apache.commons.cli.CommandLine;
+
+public class Commands {
+
+       public static final Command EXIT = new Command("exit") {
+
+               @Override
+               public void execute(Console console, CommandLine args) {
+                       console.exit();
+               }
+               
+       };
+       
+       public static final Command SET = new Command("set") {
+
+               @Override
+               public void execute(Console console, CommandLine args) {
+                       if(args.getArgs().length == 2) {
+                               console.setProperty(args.getArgs()[0], args.getArgs()[1]);
+                       } else {
+                               console.properties();
+                       }
+               }
+               
+       };
+
+}
diff --git a/openstack-console/src/main/java/com/woorea/openstack/console/Console.java b/openstack-console/src/main/java/com/woorea/openstack/console/Console.java
new file mode 100644 (file)
index 0000000..13b7fbf
--- /dev/null
@@ -0,0 +1,111 @@
+package com.woorea.openstack.console;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+import jline.UnsupportedTerminal;
+import jline.console.ConsoleReader;
+import jline.console.completer.Completer;
+import jline.console.completer.StringsCompleter;
+
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.CommandLineParser;
+import org.apache.commons.cli.GnuParser;
+import org.apache.commons.cli.HelpFormatter;
+
+public class Console {
+       
+       private Properties properties;
+       
+       private ConsoleReader reader;
+
+       private Environment environment;
+       
+       private HelpFormatter helpFormatter = new HelpFormatter();
+       
+       private static final CommandLineParser PARSER = new GnuParser();
+       
+       public Console(Environment environment, Properties properties) {
+               this.properties = properties;
+               this.environment = environment;
+       }
+       
+       public void start() throws IOException {
+               if(System.console() == null) {
+                       reader = new ConsoleReader(System.in, System.out, new UnsupportedTerminal());
+               } else {
+                       reader = new ConsoleReader();
+               }
+               do {
+                       String line = reader.readLine(environment.getPrompt());
+                       execute(line);
+               } while(true);
+       }
+       
+       public void execute(String line) {
+               String[] tokens = CommandLineHelper.parse(line);
+               if(tokens.length > 0) {
+                       Command command = environment.commands.get(tokens[0]);
+                       if(command != null) {
+                               try {
+                               CommandLine args = Console.PARSER.parse(command.getOptions(), Arrays.copyOfRange(tokens, 1, tokens.length));
+                               command.execute(this, args);
+                               } catch (Exception e) {
+                                       e.printStackTrace();
+                                       helpFormatter.printHelp(command.name, command.getOptions());
+                               }
+                       }
+               }
+       }
+
+       public void setEnvironment(Environment environment) {
+               Set<Completer> completers = new HashSet<Completer>(reader.getCompleters());
+               for(Completer c : completers) {
+                       reader.removeCompleter(c);
+               }
+               Set<String> commands = new HashSet<String>();
+               for(Map.Entry<String,Command> c : environment.commands.entrySet()) {
+                       commands.add(c.getKey());
+               }
+               reader.addCompleter(new StringsCompleter(commands));
+               this.environment = environment;
+       }
+       
+       public Environment getEnvironment() {
+               return this.environment;
+       }
+       
+       /**
+        * @return the properties
+        */
+       public String getProperty(String name) {
+               return properties.getProperty(name);
+       }
+       
+       /**
+        * @return the properties
+        */
+       public void setProperty(String name, Object value) {
+               properties.put(name, value);
+       }
+       
+       public void properties() {
+               for(Map.Entry<Object, Object> entry : properties.entrySet()) {
+                       System.out.printf("%25s = %55s",entry.getKey(), entry.getValue());
+               }
+       }
+
+       public void exit() {
+               if(environment.parent == null) {
+                       System.out.println("Goodbye");
+                       System.exit(1);
+               } else {
+                       environment = environment.parent;
+               }
+       }
+
+}
diff --git a/openstack-console/src/main/java/com/woorea/openstack/console/Environment.java b/openstack-console/src/main/java/com/woorea/openstack/console/Environment.java
new file mode 100644 (file)
index 0000000..ca0eee4
--- /dev/null
@@ -0,0 +1,30 @@
+package com.woorea.openstack.console;
+import java.util.Map;
+import java.util.TreeMap;
+
+
+public class Environment {
+
+       protected final Environment parent;
+       
+       protected Map<String, Command> commands = new TreeMap<String, Command>();
+       
+       public Environment(Environment parent) {
+               register(Commands.EXIT);
+               register(Commands.SET);
+               this.parent = parent;
+       }
+       
+       public Environment() {
+               this(null);
+       }
+
+       public void register(Command command) {
+               commands.put(command.name, command);
+       }
+
+       public String getPrompt() {
+               return "> ";
+       }
+
+}
diff --git a/openstack-console/src/main/java/com/woorea/openstack/console/Main.java b/openstack-console/src/main/java/com/woorea/openstack/console/Main.java
new file mode 100644 (file)
index 0000000..d469e54
--- /dev/null
@@ -0,0 +1,27 @@
+package com.woorea.openstack.console;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.Properties;
+
+import com.woorea.openstack.console.keystone.KeystoneEnvironment;
+import com.woorea.openstack.console.nova.NovaEnvironment;
+
+public class Main {
+
+       /**
+        * @param args
+        */
+       public static void main(String[] args) throws IOException {
+               Environment environment = new Environment();
+               environment.register(KeystoneEnvironment.KEYSTONE);
+               environment.register(NovaEnvironment.NOVA);
+               
+               Properties properties = new Properties();
+               properties.load(new FileInputStream("src/main/resources/console.properties"));
+               
+               Console console = new Console(environment, properties);
+               console.start();
+       }
+
+}
diff --git a/openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneCommand.java b/openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneCommand.java
new file mode 100644 (file)
index 0000000..f15ad24
--- /dev/null
@@ -0,0 +1,24 @@
+package com.woorea.openstack.console.keystone;
+
+import org.apache.commons.cli.CommandLine;
+
+import com.woorea.openstack.console.Command;
+import com.woorea.openstack.console.Console;
+import com.woorea.openstack.keystone.Keystone;
+
+public abstract class KeystoneCommand extends Command {
+       
+       public KeystoneCommand(String name) {
+               super(name);
+       }
+
+       @Override
+       public void execute(Console console, CommandLine args) {
+               KeystoneEnvironment environment = (KeystoneEnvironment) console.getEnvironment();
+               execute(environment.CLIENT, args);
+               
+       }
+
+       protected abstract void execute(Keystone keystone, CommandLine args);
+
+}
diff --git a/openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneEnvironment.java b/openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneEnvironment.java
new file mode 100644 (file)
index 0000000..0d0a6a2
--- /dev/null
@@ -0,0 +1,63 @@
+package com.woorea.openstack.console.keystone;
+
+import org.apache.commons.cli.CommandLine;
+
+import com.woorea.openstack.base.client.OpenStackSimpleTokenProvider;
+import com.woorea.openstack.console.Command;
+import com.woorea.openstack.console.Console;
+import com.woorea.openstack.console.Environment;
+import com.woorea.openstack.keystone.Keystone;
+import com.woorea.openstack.keystone.model.Access;
+import com.woorea.openstack.keystone.model.authentication.UsernamePassword;
+
+public class KeystoneEnvironment extends Environment {
+       
+       public final Keystone CLIENT;
+       
+       public static final Command KEYSTONE = new Command("keystone") {
+               
+               @Override
+               public void execute(Console console, CommandLine args) {
+                       
+                       Keystone client = new Keystone(console.getProperty("keystone.endpoint"));
+                       
+                       Access access = client.tokens()
+                               .authenticate(new UsernamePassword(
+                                       console.getProperty("keystone.username"), 
+                                       console.getProperty("keystone.password")
+                               ))
+                               .withTenantName(console.getProperty("keystone.tenant_name"))
+                               .execute();
+                                       
+                       client.setTokenProvider(new OpenStackSimpleTokenProvider(access.getToken().getId()));
+                       
+                       KeystoneEnvironment environment = new KeystoneEnvironment(console.getEnvironment(), client);
+                       
+                       environment.register(new KeystoneTenantList());
+                       environment.register(new KeystoneTenantCreate());
+                       environment.register(new KeystoneTenantDelete());
+                       environment.register(new KeystoneUserList());
+                       environment.register(new KeystoneUserCreate());
+                       environment.register(new KeystoneUserDelete());
+                       environment.register(new KeystoneRoleList());
+                       environment.register(new KeystoneRoleDelete());
+                       environment.register(new KeystoneServiceList());        
+                       console.setEnvironment(environment);
+               }
+               
+       };
+       
+       public KeystoneEnvironment(Environment parent, Keystone client) {
+               super(parent);
+               CLIENT = client;
+       }
+
+       /* (non-Javadoc)
+        * @see org.woorea.wsh.Environment#getPrompt()
+        */
+       @Override
+       public String getPrompt() {
+               return "keystone> ";
+       }
+       
+}
diff --git a/openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneRoleCreate.java b/openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneRoleCreate.java
new file mode 100644 (file)
index 0000000..2acdd76
--- /dev/null
@@ -0,0 +1,69 @@
+package com.woorea.openstack.console.keystone;
+
+import java.util.Arrays;
+
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.Options;
+
+import com.woorea.openstack.console.utils.Column;
+import com.woorea.openstack.console.utils.Table;
+import com.woorea.openstack.console.utils.TableModel;
+import com.woorea.openstack.keystone.Keystone;
+import com.woorea.openstack.keystone.model.Role;
+
+public class KeystoneRoleCreate extends KeystoneCommand {
+       
+       public KeystoneRoleCreate() {
+               super( "role-create");
+       }
+
+       @Override
+       public void execute(Keystone keystone, CommandLine cmd) {
+               
+               Role role = new Role();
+               role.setName(cmd.getOptionValue("name"));
+               role.setDescription(cmd.getOptionValue("description"));
+               if(cmd.getOptionValue("enabled") != null) {
+                       role.setEnabled("True");
+               }
+               
+               role = keystone.roles().create(role).execute();
+               
+               Table t = new Table(new TableModel<Role>(Arrays.asList(role)) {
+
+                       @Override
+                       public Column[] getHeaders() {
+                               return new Column[]{
+                                       new Column("id", 32, Column.ALIGN_LEFT),
+                                       new Column("name", 10, Column.ALIGN_LEFT),
+                                       new Column("description", 32, Column.ALIGN_LEFT),
+                                       new Column("enabled", 7, Column.ALIGN_LEFT)
+                               };
+                       }
+
+                       @Override
+                       public String[] getRow(Role tenant) {
+                               return new String[]{
+                                       tenant.getId(),
+                                       tenant.getName(),
+                                       tenant.getDescription(),
+                                       tenant.getEnabled().toString()
+                               };
+                       }
+               });
+               System.out.println(t.render());
+       }
+
+       /* (non-Javadoc)
+        * @see com.billingstack.commands.Command#getOptions()
+        */
+       @Override
+       public Options getOptions() {
+               Options opts = super.getOptions();
+               opts.addOption(null, "name", true, "tenant name");
+               opts.addOption(null, "description", true, "tenant description");
+               opts.addOption(null, "enabled", false, "enabled");
+               return opts;
+       }
+       
+}
diff --git a/openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneRoleDelete.java b/openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneRoleDelete.java
new file mode 100644 (file)
index 0000000..d3977b7
--- /dev/null
@@ -0,0 +1,25 @@
+package com.woorea.openstack.console.keystone;
+
+import org.apache.commons.cli.CommandLine;
+
+import com.woorea.openstack.console.utils.ConsoleUtils;
+import com.woorea.openstack.keystone.Keystone;
+
+public class KeystoneRoleDelete extends KeystoneCommand {
+       
+       public KeystoneRoleDelete() {
+               super("role-delete");
+       }
+
+       @Override
+       public void execute(Keystone keystone, CommandLine cmd) {
+               
+               String[] args = cmd.getArgs();
+               if(args.length == 1) {
+                       keystone.roles().delete(args[0]).execute();
+                       System.out.println(new ConsoleUtils().green("OK"));
+               }
+               
+       }
+       
+}
diff --git a/openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneRoleList.java b/openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneRoleList.java
new file mode 100644 (file)
index 0000000..13b7175
--- /dev/null
@@ -0,0 +1,48 @@
+package com.woorea.openstack.console.keystone;
+
+import org.apache.commons.cli.CommandLine;
+
+import com.woorea.openstack.console.utils.Column;
+import com.woorea.openstack.console.utils.Table;
+import com.woorea.openstack.console.utils.TableModel;
+import com.woorea.openstack.keystone.Keystone;
+import com.woorea.openstack.keystone.model.Role;
+import com.woorea.openstack.keystone.model.Roles;
+
+public class KeystoneRoleList extends KeystoneCommand {
+       
+       public KeystoneRoleList() {
+               super("role-list");
+       }
+
+       @Override
+       public void execute(Keystone keystone, CommandLine cmd) {
+               
+               final Roles roles = keystone.roles().list().execute();
+               
+               Table t = new Table(new TableModel<Role>(roles.getList()) {
+
+                       @Override
+                       public Column[] getHeaders() {
+                               return new Column[]{
+                                       new Column("id", 32, Column.ALIGN_LEFT),
+                                       new Column("name", 10, Column.ALIGN_LEFT),
+                                       new Column("description", 32, Column.ALIGN_LEFT),
+                                       new Column("enabled", 7, Column.ALIGN_LEFT),
+                               };
+                       }
+
+                       @Override
+                       public String[] getRow(Role role) {
+                               return new String[]{
+                                               role.getId(),
+                                               role.getName(),
+                                               role.getDescription(),
+                                               role.getEnabled()
+                               };
+                       }
+               });
+               System.out.println(t.render());
+       }
+
+}
diff --git a/openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneServiceList.java b/openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneServiceList.java
new file mode 100644 (file)
index 0000000..27542c1
--- /dev/null
@@ -0,0 +1,48 @@
+package com.woorea.openstack.console.keystone;
+
+import org.apache.commons.cli.CommandLine;
+
+import com.woorea.openstack.console.utils.Column;
+import com.woorea.openstack.console.utils.Table;
+import com.woorea.openstack.console.utils.TableModel;
+import com.woorea.openstack.keystone.Keystone;
+import com.woorea.openstack.keystone.model.Service;
+import com.woorea.openstack.keystone.model.Services;
+
+public class KeystoneServiceList extends KeystoneCommand {
+       
+       public KeystoneServiceList() {
+               super("service-list");
+       }
+
+       @Override
+       public void execute(Keystone keystone, CommandLine cmd) {
+               
+               final Services services = keystone.services().list().execute();
+               
+               Table t = new Table(new TableModel<Service>(services.getList()) {
+
+                       @Override
+                       public Column[] getHeaders() {
+                               return new Column[]{
+                                       new Column("id", 32, Column.ALIGN_LEFT),
+                                       new Column("type", 10, Column.ALIGN_LEFT),
+                                       new Column("name", 10, Column.ALIGN_LEFT),
+                                       new Column("description", 32, Column.ALIGN_LEFT)
+                               };
+                       }
+
+                       @Override
+                       public String[] getRow(Service service) {
+                               return new String[]{
+                                       service.getId(),
+                                       service.getType(),
+                                       service.getName(),
+                                       service.getDescription()
+                               };
+                       }
+               });
+               System.out.println(t.render());
+       }
+
+}
diff --git a/openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneTenantCreate.java b/openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneTenantCreate.java
new file mode 100644 (file)
index 0000000..a8336ea
--- /dev/null
@@ -0,0 +1,69 @@
+package com.woorea.openstack.console.keystone;
+
+import java.util.Arrays;
+
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.Options;
+
+import com.woorea.openstack.console.utils.Column;
+import com.woorea.openstack.console.utils.Table;
+import com.woorea.openstack.console.utils.TableModel;
+import com.woorea.openstack.keystone.Keystone;
+import com.woorea.openstack.keystone.model.Tenant;
+
+public class KeystoneTenantCreate extends KeystoneCommand {
+       
+       public KeystoneTenantCreate() {
+               super("tenant-create");
+       }
+
+       @Override
+       public void execute(Keystone keystone, CommandLine cmd) {
+               
+               Tenant tenant = new Tenant();
+               tenant.setName(cmd.getOptionValue("name"));
+               tenant.setDescription(cmd.getOptionValue("description"));
+               if(cmd.getOptionValue("enabled") != null) {
+                       tenant.setEnabled(Boolean.TRUE);
+               }
+               
+               tenant = keystone.tenants().create(tenant).execute();
+               
+               Table t = new Table(new TableModel<Tenant>(Arrays.asList(tenant)) {
+
+                       @Override
+                       public Column[] getHeaders() {
+                               return new Column[]{
+                                       new Column("id", 32, Column.ALIGN_LEFT),
+                                       new Column("name", 10, Column.ALIGN_LEFT),
+                                       new Column("description", 32, Column.ALIGN_LEFT),
+                                       new Column("enabled", 7, Column.ALIGN_LEFT)
+                               };
+                       }
+
+                       @Override
+                       public String[] getRow(Tenant tenant) {
+                               return new String[]{
+                                       tenant.getId(),
+                                       tenant.getName(),
+                                       tenant.getDescription(),
+                                       tenant.getEnabled().toString()
+                               };
+                       }
+               });
+               System.out.println(t.render());
+       }
+
+       /* (non-Javadoc)
+        * @see com.billingstack.commands.Command#getOptions()
+        */
+       @Override
+       public Options getOptions() {
+               Options opts = super.getOptions();
+               opts.addOption(null, "name", true, "tenant name");
+               opts.addOption(null, "description", true, "tenant description");
+               opts.addOption(null, "enabled", false, "enabled");
+               return opts;
+       }
+       
+}
diff --git a/openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneTenantDelete.java b/openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneTenantDelete.java
new file mode 100644 (file)
index 0000000..a79da6a
--- /dev/null
@@ -0,0 +1,25 @@
+package com.woorea.openstack.console.keystone;
+
+import org.apache.commons.cli.CommandLine;
+
+import com.woorea.openstack.console.utils.ConsoleUtils;
+import com.woorea.openstack.keystone.Keystone;
+
+public class KeystoneTenantDelete extends KeystoneCommand {
+       
+       public KeystoneTenantDelete() {
+               super("tenant-delete");
+       }
+
+       @Override
+       public void execute(Keystone keystone, CommandLine cmd) {
+               
+               String[] args = cmd.getArgs();
+               if(args.length == 1) {
+                       keystone.tenants().delete(args[0]).execute();
+                       System.out.println(new ConsoleUtils().green("OK"));
+               }
+               
+       }
+       
+}
diff --git a/openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneTenantList.java b/openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneTenantList.java
new file mode 100644 (file)
index 0000000..24ff73b
--- /dev/null
@@ -0,0 +1,48 @@
+package com.woorea.openstack.console.keystone;
+
+import org.apache.commons.cli.CommandLine;
+
+import com.woorea.openstack.console.utils.Column;
+import com.woorea.openstack.console.utils.Table;
+import com.woorea.openstack.console.utils.TableModel;
+import com.woorea.openstack.keystone.Keystone;
+import com.woorea.openstack.keystone.model.Tenant;
+import com.woorea.openstack.keystone.model.Tenants;
+
+public class KeystoneTenantList extends KeystoneCommand {
+       
+       public KeystoneTenantList() {
+               super("tenant-list");
+       }
+
+       @Override
+       public void execute(Keystone keystone, CommandLine args) {
+               
+               final Tenants tenants = keystone.tenants().list().execute();
+               
+               Table t = new Table(new TableModel<Tenant>(tenants.getList()) {
+
+                       @Override
+                       public Column[] getHeaders() {
+                               return new Column[]{
+                                       new Column("id", 32, Column.ALIGN_LEFT),
+                                       new Column("name", 32, Column.ALIGN_LEFT),
+                                       new Column("description", 32, Column.ALIGN_LEFT),
+                                       new Column("enabled", 7, Column.ALIGN_LEFT)
+                               };
+                       }
+
+                       @Override
+                       public String[] getRow(Tenant tenant) {
+                               return new String[]{
+                                       tenant.getId(),
+                                       tenant.getName(),
+                                       tenant.getDescription(),
+                                       tenant.getEnabled().toString()
+                               };
+                       }
+               });
+               System.out.println(t.render());
+       }
+
+}
diff --git a/openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneUserCreate.java b/openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneUserCreate.java
new file mode 100644 (file)
index 0000000..2628767
--- /dev/null
@@ -0,0 +1,75 @@
+package com.woorea.openstack.console.keystone;
+
+import java.util.Arrays;
+
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.Options;
+
+import com.woorea.openstack.console.utils.Column;
+import com.woorea.openstack.console.utils.Table;
+import com.woorea.openstack.console.utils.TableModel;
+import com.woorea.openstack.keystone.Keystone;
+import com.woorea.openstack.keystone.model.User;
+
+public class KeystoneUserCreate extends KeystoneCommand {
+       
+       public KeystoneUserCreate() {
+               super("user-create");
+       }
+
+       @Override
+       public void execute(Keystone keystone, CommandLine cmd) {
+               
+               User user = new User();
+               user.setName(cmd.getOptionValue("name"));
+               user.setPassword(cmd.getOptionValue("password"));
+               user.setEmail(cmd.getOptionValue("email"));
+               user.setTenantId(cmd.getOptionValue("tenant"));
+               if(cmd.getOptionValue("enabled") != null) {
+                       user.setEnabled(Boolean.TRUE);
+               }
+               
+               user = keystone.users().create(user).execute();
+               
+               Table t = new Table(new TableModel<User>(Arrays.asList(user)) {
+
+                       @Override
+                       public Column[] getHeaders() {
+                               return new Column[]{
+                                       new Column("id", 32, Column.ALIGN_LEFT),
+                                       new Column("name", 10, Column.ALIGN_LEFT),
+                                       new Column("email", 22, Column.ALIGN_LEFT),
+                                       new Column("tenant", 32, Column.ALIGN_LEFT),
+                                       new Column("enabled", 7, Column.ALIGN_LEFT)
+                               };
+                       }
+
+                       @Override
+                       public String[] getRow(User user) {
+                               return new String[]{
+                                       user.getId(),
+                                       user.getName(),
+                                       user.getEmail(),
+                                       user.getTenantId(),
+                                       user.getEnabled().toString()
+                               };
+                       }
+               });
+               System.out.println(t.render());
+       }
+
+       /* (non-Javadoc)
+        * @see com.billingstack.commands.Command#getOptions()
+        */
+       @Override
+       public Options getOptions() {
+               Options opts = super.getOptions();
+               opts.addOption(null, "name", true, "user name");
+               opts.addOption(null, "password", true, "user password");
+               opts.addOption(null, "email", true, "user email");
+               opts.addOption(null, "tenant", true, "tenant id");
+               opts.addOption(null, "enabled", false, "enabled");
+               return opts;
+       }
+       
+}
diff --git a/openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneUserDelete.java b/openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneUserDelete.java
new file mode 100644 (file)
index 0000000..77deff4
--- /dev/null
@@ -0,0 +1,25 @@
+package com.woorea.openstack.console.keystone;
+
+import org.apache.commons.cli.CommandLine;
+
+import com.woorea.openstack.console.utils.ConsoleUtils;
+import com.woorea.openstack.keystone.Keystone;
+
+public class KeystoneUserDelete extends KeystoneCommand {
+       
+       public KeystoneUserDelete() {
+               super("user-delete");
+       }
+
+       @Override
+       public void execute(Keystone keystone, CommandLine cmd) {
+               
+               String[] args = cmd.getArgs();
+               if(args.length == 1) {
+                       keystone.users().delete(args[0]).execute();
+                       System.out.println(new ConsoleUtils().green("OK"));
+               }
+               
+       }
+       
+}
diff --git a/openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneUserList.java b/openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneUserList.java
new file mode 100644 (file)
index 0000000..90bcde4
--- /dev/null
@@ -0,0 +1,50 @@
+package com.woorea.openstack.console.keystone;
+
+import org.apache.commons.cli.CommandLine;
+
+import com.woorea.openstack.console.utils.Column;
+import com.woorea.openstack.console.utils.Table;
+import com.woorea.openstack.console.utils.TableModel;
+import com.woorea.openstack.keystone.Keystone;
+import com.woorea.openstack.keystone.model.User;
+import com.woorea.openstack.keystone.model.Users;
+
+public class KeystoneUserList extends KeystoneCommand {
+       
+       public KeystoneUserList() {
+               super("user-list");
+       }
+
+       @Override
+       public void execute(Keystone keystone, CommandLine cmd) {
+               
+               final Users users = keystone.users().list().execute();
+               
+               Table t = new Table(new TableModel<User>(users.getList()) {
+
+                       @Override
+                       public Column[] getHeaders() {
+                               return new Column[]{
+                                       new Column("id", 32, Column.ALIGN_LEFT),
+                                       new Column("name", 10, Column.ALIGN_LEFT),
+                                       new Column("email", 22, Column.ALIGN_LEFT),
+                                       new Column("tenant", 32, Column.ALIGN_LEFT),
+                                       new Column("enabled", 7, Column.ALIGN_LEFT)
+                               };
+                       }
+
+                       @Override
+                       public String[] getRow(User user) {
+                               return new String[]{
+                                       user.getId(),
+                                       user.getName(),
+                                       user.getEmail(),
+                                       user.getTenantId(),
+                                       user.getEnabled().toString()
+                               };
+                       }
+               });
+               System.out.println(t.render());
+       }
+
+}
diff --git a/openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneUserShow.java b/openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneUserShow.java
new file mode 100644 (file)
index 0000000..29a447f
--- /dev/null
@@ -0,0 +1,53 @@
+package com.woorea.openstack.console.keystone;
+
+import java.util.Arrays;
+
+import org.apache.commons.cli.CommandLine;
+
+import com.woorea.openstack.console.utils.Column;
+import com.woorea.openstack.console.utils.Table;
+import com.woorea.openstack.console.utils.TableModel;
+import com.woorea.openstack.keystone.Keystone;
+import com.woorea.openstack.keystone.model.User;
+
+public class KeystoneUserShow extends KeystoneCommand {
+       
+       public KeystoneUserShow() {
+               super("user-show");
+       }
+
+       @Override
+       public void execute(Keystone keystone, CommandLine cmd) {
+               
+               String[] args = cmd.getArgs();
+               if(args.length == 1) {
+                       User user = keystone.users().show(args[0]).execute();
+                       Table t = new Table(new TableModel<User>(Arrays.asList(user)) {
+
+                               @Override
+                               public Column[] getHeaders() {
+                                       return new Column[]{
+                                               new Column("id", 32, Column.ALIGN_LEFT),
+                                               new Column("name", 10, Column.ALIGN_LEFT),
+                                               new Column("email", 22, Column.ALIGN_LEFT),
+                                               new Column("tenant", 32, Column.ALIGN_LEFT),
+                                               new Column("enabled", 7, Column.ALIGN_LEFT)
+                                       };
+                               }
+
+                               @Override
+                               public String[] getRow(User user) {
+                                       return new String[]{
+                                               user.getId(),
+                                               user.getName(),
+                                               user.getEmail(),
+                                               user.getTenantId(),
+                                               user.getEnabled().toString()
+                                       };
+                               }
+                       });
+                       System.out.println(t.render());
+               }
+       }
+
+}
diff --git a/openstack-console/src/main/java/com/woorea/openstack/console/nova/NovaCommand.java b/openstack-console/src/main/java/com/woorea/openstack/console/nova/NovaCommand.java
new file mode 100644 (file)
index 0000000..b406fbc
--- /dev/null
@@ -0,0 +1,25 @@
+package com.woorea.openstack.console.nova;
+
+import org.apache.commons.cli.CommandLine;
+
+import com.woorea.openstack.console.Command;
+import com.woorea.openstack.console.Console;
+import com.woorea.openstack.nova.Nova;
+
+
+public abstract class NovaCommand extends Command {
+       
+       public NovaCommand(String name) {
+               super(name);
+       }
+
+       @Override
+       public void execute(Console console, CommandLine args) {
+               NovaEnvironment environment = (NovaEnvironment) console.getEnvironment();
+               execute(environment.CLIENT, args);
+               
+       }
+
+       protected abstract void execute(Nova nova, CommandLine args);
+
+}
diff --git a/openstack-console/src/main/java/com/woorea/openstack/console/nova/NovaEnvironment.java b/openstack-console/src/main/java/com/woorea/openstack/console/nova/NovaEnvironment.java
new file mode 100644 (file)
index 0000000..bb2e5c4
--- /dev/null
@@ -0,0 +1,65 @@
+package com.woorea.openstack.console.nova;
+
+import org.apache.commons.cli.CommandLine;
+
+import com.woorea.openstack.base.client.OpenStackSimpleTokenProvider;
+import com.woorea.openstack.console.Command;
+import com.woorea.openstack.console.Console;
+import com.woorea.openstack.console.Environment;
+import com.woorea.openstack.keystone.Keystone;
+import com.woorea.openstack.keystone.model.Access;
+import com.woorea.openstack.keystone.model.authentication.UsernamePassword;
+import com.woorea.openstack.nova.Nova;
+
+public class NovaEnvironment extends Environment {
+       
+       public final Nova CLIENT;
+       
+       public static final Command NOVA = new Command("nova") {
+               
+               @Override
+               public void execute(Console console, CommandLine args) {
+                       
+                       if(args.getArgs().length == 1) {
+                               Keystone keystone = new Keystone((String) console.getProperty("keystone.endpoint"));
+                               
+                               Access access = keystone.tokens().authenticate(
+                                       new UsernamePassword(
+                                               console.getProperty("keystone.username"), 
+                                               console.getProperty("keystone.password")
+                                       )
+                               )
+                               .withTenantName(console.getProperty("keystone.tenant_name"))
+                               .execute();
+                               
+                               System.out.println(console.getProperty("nova.endpoint"));
+                               
+                               Nova client = new Nova(console.getProperty("nova.endpoint")+args.getArgs()[0]);
+                               client.setTokenProvider(new OpenStackSimpleTokenProvider(access.getToken().getId()));
+                               
+                               NovaEnvironment environment = new NovaEnvironment(console.getEnvironment(), client);
+                               
+                               environment.register(new NovaServerList());
+                               
+                               console.setEnvironment(environment);
+                                       
+                       }
+                       
+               }
+               
+       };
+       
+       public NovaEnvironment(Environment parent, Nova client) {
+               super(parent);
+               CLIENT = client;
+       }
+
+       /* (non-Javadoc)
+        * @see org.woorea.wsh.Environment#getPrompt()
+        */
+       @Override
+       public String getPrompt() {
+               return "nova> ";
+       }
+       
+}
diff --git a/openstack-console/src/main/java/com/woorea/openstack/console/nova/NovaServerList.java b/openstack-console/src/main/java/com/woorea/openstack/console/nova/NovaServerList.java
new file mode 100644 (file)
index 0000000..515ca2b
--- /dev/null
@@ -0,0 +1,44 @@
+package com.woorea.openstack.console.nova;
+
+import org.apache.commons.cli.CommandLine;
+
+import com.woorea.openstack.console.utils.Column;
+import com.woorea.openstack.console.utils.Table;
+import com.woorea.openstack.console.utils.TableModel;
+import com.woorea.openstack.nova.Nova;
+import com.woorea.openstack.nova.model.Server;
+import com.woorea.openstack.nova.model.Servers;
+
+public class NovaServerList extends NovaCommand {
+       
+       public NovaServerList() {
+               super("list");
+       }
+
+       @Override
+       public void execute(Nova nova, CommandLine cmd) {
+               
+               final Servers servers = nova.servers().list(true).execute();
+               
+               Table t = new Table(new TableModel<Server>(servers.getList()) {
+
+                       @Override
+                       public Column[] getHeaders() {
+                               return new Column[]{
+                                       new Column("id", 32, Column.ALIGN_LEFT),
+                                       new Column("name", 10, Column.ALIGN_LEFT)
+                               };
+                       }
+
+                       @Override
+                       public String[] getRow(Server server) {
+                               return new String[]{
+                                       server.getId(),
+                                       server.getName()
+                               };
+                       }
+               });
+               System.out.println(t.render());
+       }
+
+}
diff --git a/openstack-console/src/main/java/com/woorea/openstack/console/utils/Column.java b/openstack-console/src/main/java/com/woorea/openstack/console/utils/Column.java
new file mode 100644 (file)
index 0000000..08ffa19
--- /dev/null
@@ -0,0 +1,65 @@
+package com.woorea.openstack.console.utils;
+
+public class Column {
+
+       public static final int ALIGN_LEFT = -1;
+       public static final int ALIGN_RIGHT = 1;
+
+       private String name;
+       
+       private int size;
+       
+       private int align;
+
+       public Column(String name, int size, int align) {
+               super();
+               this.name = name;
+               this.size = size;
+               this.align = align;
+       }
+
+       /**
+        * @return the name
+        */
+       public String getName() {
+               return name;
+       }
+
+       /**
+        * @param name the name to set
+        */
+       public void setName(String name) {
+               this.name = name;
+       }
+
+       /**
+        * @return the size
+        */
+       public int getSize() {
+               return size;
+       }
+
+       /**
+        * @param size the size to set
+        */
+       public void setSize(int size) {
+               this.size = size;
+       }
+
+       /**
+        * @return the align
+        */
+       public int getAlign() {
+               return align;
+       }
+
+       /**
+        * @param align the align to set
+        */
+       public void setAlign(int align) {
+               this.align = align;
+       }
+
+       
+
+}
diff --git a/openstack-console/src/main/java/com/woorea/openstack/console/utils/ConsoleUtils.java b/openstack-console/src/main/java/com/woorea/openstack/console/utils/ConsoleUtils.java
new file mode 100644 (file)
index 0000000..8212db6
--- /dev/null
@@ -0,0 +1,47 @@
+package com.woorea.openstack.console.utils;
+
+public class ConsoleUtils {
+       
+       public static final String RED = "\u001B[31m";
+       
+       public static final String GREEN = "\u001B[32m";
+       
+       public static final String YELLOW = "\u001B[33m";
+       
+       public static final String END = "\u001B[0m";
+       
+       private StringBuilder sb = new StringBuilder();
+       
+       public ConsoleUtils append(String text) {
+               sb.append(text);
+               return this;
+       }
+       
+       public ConsoleUtils red(String text) {
+               sb.append(ConsoleUtils.RED).append(text).append(END);
+               return this;
+       }
+       
+       public ConsoleUtils green(String text) {
+               sb.append(ConsoleUtils.GREEN).append(text).append(END);
+               return this;
+       }
+       
+       public ConsoleUtils yellow(String text) {
+               sb.append(ConsoleUtils.YELLOW).append(text).append(END);
+               return this;
+       }
+       
+       public static void log(String text) {
+               System.out.println(new ConsoleUtils().yellow("| ").append(text));
+       }
+
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return sb.toString();
+       }
+       
+}
diff --git a/openstack-console/src/main/java/com/woorea/openstack/console/utils/Table.java b/openstack-console/src/main/java/com/woorea/openstack/console/utils/Table.java
new file mode 100644 (file)
index 0000000..b49ede5
--- /dev/null
@@ -0,0 +1,81 @@
+package com.woorea.openstack.console.utils;
+
+
+public class Table {
+       
+       private StringBuilder sb = new StringBuilder();
+       
+       private TableModel<?> model;
+       
+       public Table(TableModel<?> model) {
+               this.model = model;
+       }
+       
+       public StringBuilder render() {
+               header();
+               for(String[] row : model.getRows()) {
+                       int i = 0;
+                       for(String column : row) {
+                               Column columnModel = model.getHeaders()[i];
+                               sb.append("| ");
+                               if(column != null) {
+                                       if(Column.ALIGN_RIGHT == columnModel.getAlign()) {
+                                               for(int j = 0; j < columnModel.getSize() - column.length(); j++) {
+                                                       sb.append(" ");
+                                               }
+                                       }
+                                       sb.append(column.length() <= columnModel.getSize() ? column : column.substring(0, columnModel.getSize()));
+                                       if(Column.ALIGN_LEFT == columnModel.getAlign()) {
+                                               for(int j = 0; j < columnModel.getSize() - column.length(); j++) {
+                                                       sb.append(" ");
+                                               }
+                                       }
+                               } else {
+                                       for(int k = 0; k < columnModel.getSize(); k++) {
+                                               sb.append(" ");
+                                       }
+                               }
+                               sb.append(" ");
+                               i++;
+                       }
+                       sb.append("|\n");
+               }
+               for(Column c : model.getHeaders()) {
+                       sb.append("+");
+                       for(int i = 0; i < c.getSize() + 2; i++) {
+                               sb.append("-");
+                       }
+               }
+               sb.append("+\n");
+               return sb;
+       }
+       
+       public void header() {
+               for(Column c : model.getHeaders()) {
+                       sb.append("+");
+                       for(int i = 0; i < c.getSize() + 2; i++) {
+                               sb.append("-");
+                       }
+               }
+               sb.append("+\n");
+               
+               for(Column c : model.getHeaders()) {
+                       sb.append("| ");
+                       sb.append(c.getName());
+                       for(int i = 0; i < c.getSize() - c.getName().length(); i++) {
+                               sb.append(" ");
+                       }
+                       sb.append(" ");
+               }
+               sb.append("|\n");
+               
+               for(Column c : model.getHeaders()) {
+                       sb.append("+");
+                       for(int i = 0; i < c.getSize() + 2; i++) {
+                               sb.append("-");
+                       }
+               }
+               sb.append("+\n");
+       }
+
+}
diff --git a/openstack-console/src/main/java/com/woorea/openstack/console/utils/TableModel.java b/openstack-console/src/main/java/com/woorea/openstack/console/utils/TableModel.java
new file mode 100644 (file)
index 0000000..f1ae84a
--- /dev/null
@@ -0,0 +1,25 @@
+package com.woorea.openstack.console.utils;
+
+import java.util.List;
+
+public abstract class TableModel<T> {
+       
+       protected List<T> data;
+       
+       public TableModel(List<T> data) {
+               this.data = data;
+       }
+       
+       public abstract Column[] getHeaders();
+
+       public final String[][] getRows() {
+               String[][] rows = new String[data.size()][];
+               for(int i = 0; i < data.size(); i++) {
+                       rows[i] = getRow(data.get(i));
+               }
+               return rows;
+       }
+       
+       public abstract String[] getRow(T data);
+       
+}
diff --git a/openstack-console/src/main/resources/console.properties b/openstack-console/src/main/resources/console.properties
new file mode 100644 (file)
index 0000000..01902e4
--- /dev/null
@@ -0,0 +1,6 @@
+keystone.endpoint=http://keystone.stacksherpa.org/v2.0
+keystone.username=admin
+keystone.password=secret0
+keystone.tenant_name=admin
+
+nova.endpoint=http://compute/v2/
\ No newline at end of file
diff --git a/openstack-examples/pom.xml b/openstack-examples/pom.xml
new file mode 100644 (file)
index 0000000..9aee3b3
--- /dev/null
@@ -0,0 +1,84 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.openecomp.mso</groupId>
+    <artifactId>openstack-java-sdk</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+  </parent>
+        <groupId>org.openecomp.mso.libs.openstack-java-sdk</groupId>
+  <artifactId>openstack-examples</artifactId>
+  <name>OpenStack Examples</name>
+  <description>OpenStack Examples</description>
+  <dependencies>
+       <dependency>
+               <groupId>org.openecomp.mso</groupId>
+               <artifactId>keystone-client</artifactId>
+               <version>1.0.0-SNAPSHOT</version>
+       </dependency>
+       <dependency>
+               <groupId>org.openecomp.mso</groupId>
+               <artifactId>nova-client</artifactId>
+               <version>1.0.0-SNAPSHOT</version>
+       </dependency>
+      <dependency>
+          <groupId>org.openecomp.mso</groupId>
+          <artifactId>heat-client</artifactId>
+          <version>1.0.0-SNAPSHOT</version>
+      </dependency>
+       <dependency>
+               <groupId>org.openecomp.mso</groupId>
+               <artifactId>swift-client</artifactId>
+               <version>1.0.0-SNAPSHOT</version>
+       </dependency>
+       <dependency>
+               <groupId>org.openecomp.mso</groupId>
+               <artifactId>quantum-client</artifactId>
+               <version>1.0.0-SNAPSHOT</version>
+       </dependency>
+       <dependency>
+               <groupId>org.openecomp.mso</groupId>
+               <artifactId>ceilometer-client</artifactId>
+               <version>1.0.0-SNAPSHOT</version>
+       </dependency>
+       <dependency>
+               <groupId>org.openecomp.mso</groupId>
+               <artifactId>glance-client</artifactId>
+               <version>1.0.0-SNAPSHOT</version>
+       </dependency>
+  </dependencies>
+  <profiles>
+       <profile>
+               <id>jersey</id>
+               <dependencies>
+                       <dependency>
+                               <groupId>org.openecomp.mso</groupId>
+                               <artifactId>jersey-connector</artifactId>
+                               <version>3.0.0-SNAPSHOT</version>
+                       </dependency>
+               </dependencies>
+       </profile>
+       <profile>
+               <id>jersey2</id>
+               <activation>
+                       <activeByDefault>true</activeByDefault>
+               </activation>
+               <dependencies>
+                       <dependency>
+                               <groupId>org.openecomp.mso</groupId>
+                               <artifactId>jersey2-connector</artifactId>
+                               <version>3.1.0-SNAPSHOT</version>
+                       </dependency>
+               </dependencies>
+       </profile>
+       <profile>
+               <id>resteasy</id>
+               <dependencies>
+                       <dependency>
+                               <groupId>org.openecomp.mso</groupId>
+                               <artifactId>resteasy-connector</artifactId>
+                               <version>3.1.0-SNAPSHOT</version>
+                       </dependency>
+               </dependencies>
+       </profile>
+  </profiles>
+</project>
\ No newline at end of file
diff --git a/openstack-examples/src/main/java/com/woorea/openstack/examples/ExamplesConfiguration.java b/openstack-examples/src/main/java/com/woorea/openstack/examples/ExamplesConfiguration.java
new file mode 100644 (file)
index 0000000..056eae5
--- /dev/null
@@ -0,0 +1,34 @@
+package com.woorea.openstack.examples;
+
+
+import com.woorea.openstack.base.client.OpenStackSimpleTokenProvider;
+import com.woorea.openstack.keystone.Keystone;
+import com.woorea.openstack.keystone.model.Tenant;
+
+public class ExamplesConfiguration {
+
+       public static final String KEYSTONE_AUTH_URL = "https://region-a.geo-1.identity.hpcloudsvc.com:35357/v3";
+       
+       public static final String KEYSTONE_USERNAME = "";
+       
+       public static final String KEYSTONE_PASSWORD = "";
+       
+       public static final String KEYSTONE_ENDPOINT = "https://region-a.geo-1.identity.hpcloudsvc.com:35357/v3";
+       
+       public static final String TENANT_NAME = "admin";
+
+       public static final String NOVA_ENDPOINT = "http://compute/v2";
+       
+       public static final String CEILOMETER_ENDPOINT = "";
+       
+       public static void main(String[] args) {
+               Keystone client = new Keystone(KEYSTONE_ENDPOINT);
+               client.setTokenProvider(new OpenStackSimpleTokenProvider("secret0"));
+               client.tenants().delete("36c481aec1d54fc49190c92c3ef6840a").execute();
+               Tenant tenant = client.tenants().create(new Tenant("new_api")).execute();
+               System.out.println(tenant);
+               System.out.println(client.tenants().list().execute());
+               client.tenants().delete(tenant.getId()).execute();
+       }
+       
+}
diff --git a/openstack-examples/src/main/java/com/woorea/openstack/examples/compute/NovaCreateServer.java b/openstack-examples/src/main/java/com/woorea/openstack/examples/compute/NovaCreateServer.java
new file mode 100644 (file)
index 0000000..643f14b
--- /dev/null
@@ -0,0 +1,90 @@
+package com.woorea.openstack.examples.compute;
+
+
+import com.woorea.openstack.base.client.OpenStackSimpleTokenProvider;
+import com.woorea.openstack.examples.ExamplesConfiguration;
+import com.woorea.openstack.keystone.Keystone;
+import com.woorea.openstack.keystone.model.Access;
+import com.woorea.openstack.keystone.model.Tenants;
+import com.woorea.openstack.nova.Nova;
+import com.woorea.openstack.nova.model.Flavors;
+import com.woorea.openstack.nova.model.Images;
+import com.woorea.openstack.nova.model.KeyPairs;
+import com.woorea.openstack.nova.model.Server;
+import com.woorea.openstack.nova.model.ServerForCreate;
+
+public class NovaCreateServer {
+
+  /**
+   * @param args
+   */
+  public static void main(String[] args) {
+    Keystone keystone = new Keystone(ExamplesConfiguration.KEYSTONE_AUTH_URL);
+    // access with unscoped token
+    Access access = keystone
+        .tokens()
+        .authenticate()
+        .withUsernamePassword(ExamplesConfiguration.KEYSTONE_USERNAME, ExamplesConfiguration.KEYSTONE_PASSWORD)
+        .execute();
+
+    // use the token in the following requests
+    keystone.token(access.getToken().getId());
+
+    Tenants tenants = keystone.tenants().list().execute();
+
+    // try to exchange token using the first tenant
+    if (tenants.getList().size() > 0) {
+
+      access = keystone.tokens().authenticate()
+          .withToken(access.getToken().getId())
+          .withTenantId(tenants.getList().get(0).getId()).execute();
+
+      // NovaClient novaClient = new
+      // NovaClient(KeystoneUtils.findEndpointURL(access.getServiceCatalog(),
+      // "compute", null, "public"), access.getToken().getId());
+      Nova nova = new Nova(ExamplesConfiguration.NOVA_ENDPOINT.concat(tenants
+          .getList().get(0).getId()));
+      nova.setTokenProvider(new OpenStackSimpleTokenProvider(access.getToken()
+          .getId()));
+      // novaClient.enableLogging(Logger.getLogger("nova"), 100 * 1024);
+      // create a new keypair
+      // KeyPair keyPair =
+      // novaClient.execute(KeyPairsExtension.createKeyPair("mykeypair"));
+      // System.out.println(keyPair.getPrivateKey());
+
+      // create security group
+      // SecurityGroup securityGroup =
+      // novaClient.execute(SecurityGroupsExtension.createSecurityGroup("mysecuritygroup",
+      // "description"));
+
+      // novaClient.execute(SecurityGroupsExtension.createSecurityGroupRule(securityGroup.getId(),
+      // "UDP", 9090, 9092, "0.0.0.0/0"));
+      // novaClient.execute(SecurityGroupsExtension.createSecurityGroupRule(securityGroup.getId(),
+      // "TCP", 8080, 8080, "0.0.0.0/0"));
+
+      KeyPairs keysPairs = nova.keyPairs().list().execute();
+
+      Images images = nova.images().list(true).execute();
+
+      Flavors flavors = nova.flavors().list(true).execute();
+
+      ServerForCreate serverForCreate = new ServerForCreate();
+      serverForCreate.setName("woorea");
+      serverForCreate.setFlavorRef(flavors.getList().get(0).getId());
+      serverForCreate.setImageRef(images.getList().get(1).getId());
+      serverForCreate.setKeyName(keysPairs.getList().get(0).getName());
+      serverForCreate.getSecurityGroups()
+          .add(new ServerForCreate.SecurityGroup("default"));
+      // serverForCreate.getSecurityGroups().add(new
+      // ServerForCreate.SecurityGroup(securityGroup.getName()));
+
+      Server server = nova.servers().boot(serverForCreate).execute();
+      System.out.println(server);
+
+    } else {
+      System.out.println("No tenants found!");
+    }
+
+  }
+
+}
diff --git a/openstack-examples/src/main/java/com/woorea/openstack/examples/compute/NovaListFlavors.java b/openstack-examples/src/main/java/com/woorea/openstack/examples/compute/NovaListFlavors.java
new file mode 100644 (file)
index 0000000..893192d
--- /dev/null
@@ -0,0 +1,51 @@
+package com.woorea.openstack.examples.compute;
+
+
+import com.woorea.openstack.examples.ExamplesConfiguration;
+import com.woorea.openstack.keystone.Keystone;
+import com.woorea.openstack.keystone.model.Access;
+import com.woorea.openstack.keystone.model.Tenants;
+import com.woorea.openstack.keystone.model.authentication.TokenAuthentication;
+import com.woorea.openstack.keystone.model.authentication.UsernamePassword;
+import com.woorea.openstack.nova.Nova;
+import com.woorea.openstack.nova.model.Flavor;
+import com.woorea.openstack.nova.model.Flavors;
+
+public class NovaListFlavors {
+
+       /**
+        * @param args
+        */
+       public static void main(String[] args) {
+               Keystone keystone = new Keystone(ExamplesConfiguration.KEYSTONE_AUTH_URL);
+               Access access = keystone.tokens().authenticate(
+                               new UsernamePassword(ExamplesConfiguration.KEYSTONE_USERNAME, ExamplesConfiguration.KEYSTONE_PASSWORD))
+                               .execute();
+               
+               //use the token in the following requests
+               keystone.token(access.getToken().getId());
+               
+               Tenants tenants = keystone.tenants().list().execute();
+               
+               //try to exchange token using the first tenant
+               if(tenants.getList().size() > 0) {
+                       
+                       access = keystone.tokens().authenticate(new TokenAuthentication(access.getToken().getId())).withTenantId(tenants.getList().get(0).getId()).execute();
+                       
+                       //NovaClient novaClient = new NovaClient(KeystoneUtils.findEndpointURL(access.getServiceCatalog(), "compute", null, "public"), access.getToken().getId());
+                       Nova novaClient = new Nova(ExamplesConfiguration.NOVA_ENDPOINT.concat("/").concat(tenants.getList().get(0).getId()));
+                       novaClient.token(access.getToken().getId());
+                       //novaClient.enableLogging(Logger.getLogger("nova"), 100 * 1024);
+                       
+                       Flavors flavors = novaClient.flavors().list(true).execute();
+                       for(Flavor flavor : flavors) {
+                               System.out.println(flavor);
+                       }
+                       
+               } else {
+                       System.out.println("No tenants found!");
+               }
+               
+       }
+
+}
diff --git a/openstack-examples/src/main/java/com/woorea/openstack/examples/compute/NovaListImages.java b/openstack-examples/src/main/java/com/woorea/openstack/examples/compute/NovaListImages.java
new file mode 100644 (file)
index 0000000..edf2f63
--- /dev/null
@@ -0,0 +1,52 @@
+package com.woorea.openstack.examples.compute;
+
+
+import com.woorea.openstack.examples.ExamplesConfiguration;
+import com.woorea.openstack.keystone.Keystone;
+import com.woorea.openstack.keystone.model.Access;
+import com.woorea.openstack.keystone.model.Tenants;
+import com.woorea.openstack.keystone.model.authentication.TokenAuthentication;
+import com.woorea.openstack.keystone.model.authentication.UsernamePassword;
+import com.woorea.openstack.nova.Nova;
+import com.woorea.openstack.nova.model.Image;
+import com.woorea.openstack.nova.model.Images;
+
+public class NovaListImages {
+       
+       /**
+        * @param args
+        */
+       public static void main(String[] args) {
+               
+               Keystone keystone = new Keystone(ExamplesConfiguration.KEYSTONE_AUTH_URL);
+               Access access = keystone.tokens().authenticate(new UsernamePassword(ExamplesConfiguration.KEYSTONE_USERNAME, ExamplesConfiguration.KEYSTONE_PASSWORD)).execute();
+               
+               //use the token in the following requests
+               keystone.token(access.getToken().getId());
+               
+               Tenants tenants = keystone.tenants().list().execute();
+               
+               //try to exchange token using the first tenant
+               if(tenants.getList().size() > 0) {
+                       
+                       access = keystone.tokens().authenticate(new TokenAuthentication(access.getToken().getId()))
+                                       .withTenantId(tenants.getList().get(0).getId())
+                                       .execute();
+                       
+                       //NovaClient novaClient = new NovaClient(KeystoneUtils.findEndpointURL(access.getServiceCatalog(), "compute", null, "public"), access.getToken().getId());
+                       Nova novaClient = new Nova(ExamplesConfiguration.NOVA_ENDPOINT.concat("/").concat(tenants.getList().get(0).getId()));
+                       novaClient.token(access.getToken().getId());
+                       //novaClient.enableLogging(Logger.getLogger("nova"), 100 * 1024);
+                       
+                       Images images = novaClient.images().list(true).execute();
+                       for(Image image : images) {
+                               System.out.println(image);
+                       }
+                       
+               } else {
+                       System.out.println("No tenants found!");
+               }
+               
+       }
+
+}
diff --git a/openstack-examples/src/main/java/com/woorea/openstack/examples/compute/NovaListServers.java b/openstack-examples/src/main/java/com/woorea/openstack/examples/compute/NovaListServers.java
new file mode 100644 (file)
index 0000000..cab24e1
--- /dev/null
@@ -0,0 +1,38 @@
+package com.woorea.openstack.examples.compute;
+
+
+import com.woorea.openstack.examples.ExamplesConfiguration;
+import com.woorea.openstack.keystone.Keystone;
+import com.woorea.openstack.keystone.model.Access;
+import com.woorea.openstack.keystone.model.authentication.UsernamePassword;
+import com.woorea.openstack.nova.Nova;
+import com.woorea.openstack.nova.model.Server;
+import com.woorea.openstack.nova.model.Servers;
+
+public class NovaListServers {
+       
+       /**
+        * @param args
+        */
+       public static void main(String[] args) {
+               Keystone keystone = new Keystone(ExamplesConfiguration.KEYSTONE_AUTH_URL);
+               Access access = keystone.tokens().authenticate(new UsernamePassword(ExamplesConfiguration.KEYSTONE_USERNAME, ExamplesConfiguration.KEYSTONE_PASSWORD))
+                               .withTenantName("demo")
+                               .execute();
+               
+               //use the token in the following requests
+               keystone.token(access.getToken().getId());
+                       
+               //NovaClient novaClient = new NovaClient(KeystoneUtils.findEndpointURL(access.getServiceCatalog(), "compute", null, "public"), access.getToken().getId());
+               Nova novaClient = new Nova(ExamplesConfiguration.NOVA_ENDPOINT.concat("/").concat(access.getToken().getTenant().getId()));
+               novaClient.token(access.getToken().getId());
+               //novaClient.enableLogging(Logger.getLogger("nova"), 100 * 1024);
+               
+               Servers servers = novaClient.servers().list(true).execute();
+               for(Server server : servers) {
+                       System.out.println(server);
+               }
+               
+       }
+
+}
diff --git a/openstack-examples/src/main/java/com/woorea/openstack/examples/compute/NovaStopStartServer.java b/openstack-examples/src/main/java/com/woorea/openstack/examples/compute/NovaStopStartServer.java
new file mode 100644 (file)
index 0000000..df4d44b
--- /dev/null
@@ -0,0 +1,40 @@
+package com.woorea.openstack.examples.compute;
+
+import com.woorea.openstack.examples.ExamplesConfiguration;
+import com.woorea.openstack.keystone.Keystone;
+import com.woorea.openstack.keystone.model.Access;
+import com.woorea.openstack.keystone.model.authentication.UsernamePassword;
+import com.woorea.openstack.nova.Nova;
+import com.woorea.openstack.nova.api.ServersResource;
+import com.woorea.openstack.nova.model.Servers;
+
+public class NovaStopStartServer {
+       public static void main(String[] args) throws InterruptedException {
+               Keystone keystone = new Keystone(ExamplesConfiguration.KEYSTONE_AUTH_URL);
+               Access access = keystone.tokens().authenticate(new UsernamePassword(ExamplesConfiguration.KEYSTONE_USERNAME, ExamplesConfiguration.KEYSTONE_PASSWORD))
+                               .withTenantName(ExamplesConfiguration.TENANT_NAME)
+                               .execute();
+
+               //use the token in the following requests
+               keystone.token(access.getToken().getId());
+
+               Nova novaClient = new Nova(ExamplesConfiguration.NOVA_ENDPOINT.concat("/").concat(access.getToken().getTenant().getId()));
+               novaClient.token(access.getToken().getId());
+
+               Servers servers = novaClient.servers().list(true).execute();
+               if(servers.getList().size() > 0) {
+
+                       // Server has to be in activated state.
+                       ServersResource.StopServer stopServer = novaClient.servers().stop(servers.getList().get(0).getId());
+                       stopServer.endpoint(ExamplesConfiguration.NOVA_ENDPOINT);
+                       stopServer.execute();
+
+                       // Wait until server shutdown. Or 400 error occurs.
+                       Thread.sleep(5000);
+
+                       ServersResource.StartServer startServer = novaClient.servers().start(servers.getList().get(0).getId());
+                       startServer.endpoint(ExamplesConfiguration.NOVA_ENDPOINT);
+                       startServer.execute();
+               }
+       }
+}
diff --git a/openstack-examples/src/main/java/com/woorea/openstack/examples/glance/GlanceListImages.java b/openstack-examples/src/main/java/com/woorea/openstack/examples/glance/GlanceListImages.java
new file mode 100644 (file)
index 0000000..ea687aa
--- /dev/null
@@ -0,0 +1,83 @@
+package com.woorea.openstack.examples.glance;
+
+import com.woorea.openstack.glance.model.ImageDownload;
+import com.woorea.openstack.glance.model.ImageUpload;
+import com.woorea.openstack.keystone.utils.KeystoneTokenProvider;
+
+import com.woorea.openstack.examples.ExamplesConfiguration;
+import com.woorea.openstack.glance.Glance;
+import com.woorea.openstack.glance.model.Image;
+import com.woorea.openstack.glance.model.Images;
+import com.woorea.openstack.keystone.model.Access;
+import com.woorea.openstack.keystone.model.Access.Service;
+import com.woorea.openstack.keystone.model.Access.Service.Endpoint;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+
+public class GlanceListImages {
+
+       protected static String IMAGE_CONTENT = "Hello World!";
+
+       /**
+        * @param args
+        */
+       public static void main(String[] args) {
+               KeystoneTokenProvider keystone = new KeystoneTokenProvider(
+                               ExamplesConfiguration.KEYSTONE_AUTH_URL,
+                               ExamplesConfiguration.KEYSTONE_USERNAME,
+                               ExamplesConfiguration.KEYSTONE_PASSWORD);
+
+               Access access = keystone.getAccessByTenant(ExamplesConfiguration.TENANT_NAME);
+
+               Service glanceService = null;
+
+               for (Service service : access.getServiceCatalog()) {
+                       if (service.getType().equals("image")) {
+                               glanceService = service;
+                               break;
+                       }
+               }
+
+               if (glanceService == null) {
+                       throw new RuntimeException("Glance service not found");
+               }
+
+               for (Endpoint endpoint : glanceService.getEndpoints()) {
+                       Glance glance = new Glance(endpoint.getPublicURL() + "/v1");
+                       glance.setTokenProvider(keystone
+                                       .getProviderByTenant(ExamplesConfiguration.TENANT_NAME));
+
+                       // Creating a new image
+                       Image newImage = new Image();
+                       newImage.setDiskFormat("raw");
+                       newImage.setContainerFormat("bare");
+                       newImage.setName("os-java-glance-test");
+                       newImage = glance.images().create(newImage).execute();
+
+                       // Uploading image
+                       ImageUpload uploadImage = new ImageUpload(newImage);
+                       uploadImage.setInputStream(new ByteArrayInputStream(IMAGE_CONTENT.getBytes()));
+                       glance.images().upload(newImage.getId(), uploadImage).execute();
+
+                       // Downloading the image and displaying the image content
+                       try {
+                               byte[] imgContent = new byte[IMAGE_CONTENT.length()];
+                               ImageDownload downloadImage = glance.images().download(newImage.getId()).execute();
+                               downloadImage.getInputStream().read(imgContent, 0, imgContent.length);
+                               System.out.println(new String(imgContent));
+                       } catch (IOException e) {
+                               e.printStackTrace();
+                       }
+
+                       Images images = glance.images().list(false).execute();
+
+                       for (Image image : images) {
+                               System.out.println(glance.images().show(image.getId()).execute());
+                       }
+
+                       glance.images().delete(newImage.getId()).execute();
+               }
+       }
+
+}
diff --git a/openstack-examples/src/main/java/com/woorea/openstack/examples/heat/HeatListStacks.java b/openstack-examples/src/main/java/com/woorea/openstack/examples/heat/HeatListStacks.java
new file mode 100644 (file)
index 0000000..ee9fe44
--- /dev/null
@@ -0,0 +1,76 @@
+package com.woorea.openstack.examples.heat;
+
+/*
+ * Modifications copyright (c) 2017 AT&T Intellectual Property
+ */
+
+import com.woorea.openstack.examples.ExamplesConfiguration;
+import com.woorea.openstack.heat.Heat;
+import com.woorea.openstack.heat.model.CreateStackParam;
+import com.woorea.openstack.heat.model.Stack;
+import com.woorea.openstack.keystone.model.Access;
+import com.woorea.openstack.keystone.utils.KeystoneTokenProvider;
+import com.woorea.openstack.keystone.utils.KeystoneUtils;
+
+import java.util.Collections;
+
+public class HeatListStacks {
+
+    private static String TEMPLATE = "{\n" +
+            "    \"HeatTemplateFormatVersion\": \"2012-12-12\",\n" +
+            "    \"Parameters\": {},\n" +
+            "    \"Mappings\": {},\n" +
+            "    \"Resources\": {\n" +
+            "        \"my-test-server\": {\n" +
+            "            \"Type\": \"OS::Nova::Server\",\n" +
+            "            \"Properties\": {\n" +
+            "                \"flavor\": \"m1.small\",\n" +
+            "                \"image\": \"centos:latest\"\n" +
+            "            }\n" +
+            "        }\n" +
+            "    }\n" +
+            "}";
+
+    /**
+     * @param args
+     */
+    public static void main(String[] args) throws InterruptedException {
+        KeystoneTokenProvider keystone = new KeystoneTokenProvider(
+                ExamplesConfiguration.KEYSTONE_ENDPOINT,
+                ExamplesConfiguration.KEYSTONE_USERNAME,
+                ExamplesConfiguration.KEYSTONE_PASSWORD
+        );
+
+        Access access = keystone.getAccessByTenant(ExamplesConfiguration.TENANT_NAME);
+
+        String endpointURL = KeystoneUtils.findEndpointURL(access.getServiceCatalog(), "orchestration", null, "public");
+
+
+        Heat heat = new Heat(endpointURL);
+        heat.setTokenProvider(keystone
+                .getProviderByTenant(ExamplesConfiguration.TENANT_NAME));
+
+        CreateStackParam param = new CreateStackParam();
+        param.setStackName("helloWorld");
+        param.setTimeoutMinutes(1);
+        param.setParameters(Collections.<String, Object>emptyMap());
+        param.setTemplate(TEMPLATE);
+
+        System.out.printf("Create: " + heat.getStacks().create(param).execute());
+        Thread.sleep(3000);
+
+        for (Stack s : heat.getStacks().list().execute()) {
+            System.out.println(s.getDescription());
+            System.out.println(s.getId());
+            System.out.println(s.getStackName());
+            System.out.println(s.getStackStatus());
+            System.out.println(s.getCreationTime());
+            System.out.println(s.getUpdatedTime());
+            System.out.println(s.getLinks());
+
+            System.out.println(heat.getStacks().byName(s.getStackName()).execute());
+
+
+        }
+    }
+}
diff --git a/openstack-examples/src/main/java/com/woorea/openstack/examples/hpcloud/Keystone3Authentication.java b/openstack-examples/src/main/java/com/woorea/openstack/examples/hpcloud/Keystone3Authentication.java
new file mode 100644 (file)
index 0000000..5481a15
--- /dev/null
@@ -0,0 +1,34 @@
+package com.woorea.openstack.examples.hpcloud;
+
+
+import com.woorea.openstack.base.client.OpenStackResponse;
+import com.woorea.openstack.examples.ExamplesConfiguration;
+import com.woorea.openstack.keystone.v3.model.Authentication;
+import com.woorea.openstack.keystone.v3.model.Authentication.Identity;
+import com.woorea.openstack.keystone.v3.Keystone;
+import com.woorea.openstack.keystone.v3.model.Token;
+
+public class Keystone3Authentication {
+
+  /**
+   * @param args
+   */
+  public static void main(String[] args) {
+    Keystone keystone = new Keystone(ExamplesConfiguration.KEYSTONE_AUTH_URL);
+    
+    Authentication auth = new Authentication();
+    auth.setIdentity(Identity.password(ExamplesConfiguration.KEYSTONE_USERNAME, ExamplesConfiguration.KEYSTONE_PASSWORD));
+    
+    OpenStackResponse response = keystone.tokens().authenticate(auth).request();
+    
+    String tokenId = response.header("X-Subject-Token");
+    
+    Token token = response.getEntity(Token.class);
+    
+    System.out.println(tokenId);
+
+    System.out.println(token);
+
+  }
+
+}
diff --git a/openstack-examples/src/main/java/com/woorea/openstack/examples/hpcloud/KeystoneAuthentication.java b/openstack-examples/src/main/java/com/woorea/openstack/examples/hpcloud/KeystoneAuthentication.java
new file mode 100644 (file)
index 0000000..1caffea
--- /dev/null
@@ -0,0 +1,29 @@
+package com.woorea.openstack.examples.hpcloud;
+
+
+import com.woorea.openstack.examples.ExamplesConfiguration;
+import com.woorea.openstack.keystone.Keystone;
+import com.woorea.openstack.keystone.model.Access;
+
+public class KeystoneAuthentication {
+
+  private static final String KEYSTONE_AUTH_URL = "https://region-a.geo-1.identity.hpcloudsvc.com:35357/v2.0";
+
+  /**
+   * @param args
+   */
+  public static void main(String[] args) {
+    Keystone keystone = new Keystone(KEYSTONE_AUTH_URL);
+
+    // access with unscoped token
+    Access access = keystone
+        .tokens()
+        .authenticate()
+        .withUsernamePassword(ExamplesConfiguration.KEYSTONE_USERNAME, ExamplesConfiguration.KEYSTONE_PASSWORD)
+        .execute();
+
+    System.out.println(access);
+
+  }
+
+}
diff --git a/openstack-examples/src/main/java/com/woorea/openstack/examples/keystone/KeystoneCreateTenant.java b/openstack-examples/src/main/java/com/woorea/openstack/examples/keystone/KeystoneCreateTenant.java
new file mode 100644 (file)
index 0000000..9bd3399
--- /dev/null
@@ -0,0 +1,36 @@
+package com.woorea.openstack.examples.keystone;
+
+
+import com.woorea.openstack.examples.ExamplesConfiguration;
+import com.woorea.openstack.keystone.Keystone;
+import com.woorea.openstack.keystone.model.Access;
+import com.woorea.openstack.keystone.model.Tenant;
+import com.woorea.openstack.keystone.model.authentication.TokenAuthentication;
+import com.woorea.openstack.keystone.model.authentication.UsernamePassword;
+
+public class KeystoneCreateTenant {
+
+       /**
+        * @param args
+        */
+       public static void main(String[] args) {
+               Keystone keystone = new Keystone(ExamplesConfiguration.KEYSTONE_AUTH_URL);
+               //access with unscoped token
+               Access access = keystone.tokens().authenticate(
+                               new UsernamePassword(ExamplesConfiguration.KEYSTONE_USERNAME, ExamplesConfiguration.KEYSTONE_PASSWORD))
+                               .execute();
+
+               access = keystone.tokens().authenticate(new TokenAuthentication(access.getToken().getId())).withTenantName("admin").execute();
+
+               Tenant tenant = new Tenant();
+               tenant.setName("benn.cs");
+               tenant.setDescription("benn.cs");
+               tenant.setEnabled(true);
+               //Get the adminURL client and use the token got above
+               keystone = new Keystone("http://keystone.x.org/v2.0");
+               keystone.token(access.getToken().getId());
+               tenant = keystone.tenants().create(tenant).execute();
+               System.out.println(tenant);
+               keystone.tenants().delete(tenant.getId());
+       }
+}
diff --git a/openstack-examples/src/main/java/com/woorea/openstack/examples/keystone/KeystoneCreateUser.java b/openstack-examples/src/main/java/com/woorea/openstack/examples/keystone/KeystoneCreateUser.java
new file mode 100644 (file)
index 0000000..bde2440
--- /dev/null
@@ -0,0 +1,38 @@
+package com.woorea.openstack.examples.keystone;
+
+
+import com.woorea.openstack.base.client.OpenStackSimpleTokenProvider;
+import com.woorea.openstack.examples.ExamplesConfiguration;
+import com.woorea.openstack.keystone.Keystone;
+import com.woorea.openstack.keystone.model.Access;
+import com.woorea.openstack.keystone.model.User;
+import com.woorea.openstack.keystone.model.authentication.UsernamePassword;
+
+public class KeystoneCreateUser {
+
+       /**
+        * @param args
+        */
+       public static void main(String[] args) {
+               Keystone keystone = new Keystone(ExamplesConfiguration.KEYSTONE_AUTH_URL);
+               //access with unscoped token
+               Access access = keystone.tokens()
+                       .authenticate(new UsernamePassword(ExamplesConfiguration.KEYSTONE_USERNAME, ExamplesConfiguration.KEYSTONE_PASSWORD))
+                       .withTenantName("admin")
+                       .execute();
+
+               User user = new User();
+               user.setEmail("luis@woorea.es");
+               user.setUsername("luis.gervaso");
+               user.setPassword("password.0");
+               user.setName("Luis");
+               user.setEnabled(Boolean.TRUE);
+
+               keystone = new Keystone("http://keystone.x.org/v2.0");
+               keystone.setTokenProvider(new OpenStackSimpleTokenProvider(access.getToken().getId()));
+               //keystone.enableLogging(Logger.getLogger("keystone"), 10000);
+               user = keystone.users().create(user).execute();
+               System.out.println(user);
+               keystone.users().delete(user.getId()).execute();
+       }
+}
diff --git a/openstack-examples/src/main/java/com/woorea/openstack/examples/metering/v2/TestAll.java b/openstack-examples/src/main/java/com/woorea/openstack/examples/metering/v2/TestAll.java
new file mode 100644 (file)
index 0000000..c9d0c18
--- /dev/null
@@ -0,0 +1,62 @@
+package com.woorea.openstack.examples.metering.v2;
+
+import java.util.List;
+
+
+import com.woorea.openstack.base.client.OpenStackSimpleTokenProvider;
+import com.woorea.openstack.ceilometer.Ceilometer;
+import com.woorea.openstack.ceilometer.v2.model.Meter;
+import com.woorea.openstack.ceilometer.v2.model.Statistics;
+import com.woorea.openstack.examples.ExamplesConfiguration;
+import com.woorea.openstack.keystone.Keystone;
+import com.woorea.openstack.keystone.model.Access;
+import com.woorea.openstack.keystone.model.authentication.UsernamePassword;
+
+public class TestAll {
+
+       /**
+        * @param args
+        */
+       public static void main(String[] args) {
+               Keystone keystone = new Keystone(ExamplesConfiguration.KEYSTONE_AUTH_URL);
+               Access access = keystone.tokens()
+                               .authenticate(new UsernamePassword(ExamplesConfiguration.KEYSTONE_USERNAME, ExamplesConfiguration.KEYSTONE_PASSWORD))
+                               .withTenantName("admin")
+                               .execute();
+               
+               Ceilometer ceilometer = new Ceilometer(ExamplesConfiguration.CEILOMETER_ENDPOINT);
+               ceilometer.setTokenProvider(new OpenStackSimpleTokenProvider(access.getToken().getId()));
+
+               /*
+               List<Resource> resources = ceilometer.execute(new ResourceList().eq("resource_id", "23b55841eedd41e99d5f3f32149ca086"));
+               
+               
+               for(Resource r : resources) {
+                       Resource resource = ceilometer.execute(new ResourceShow().id(r.getResource()));
+               }
+               */
+               
+               /*
+               //List<Meter> meters = ceilometer.meters().list().execute(); //execute(new MeterList().eq("project_id", "948eeb593acd4223ad572c49e1ef5709"));
+               
+               
+               for(Meter m : meters) {
+                       System.out.println(m);
+                       
+//                     List<Sample> samples = ceilometer.execute(new MeterShow().name(m.getName()));
+//                     for(Sample s : samples) {
+//                             System.out.println("\t" + s);
+//                     }
+                       
+                       List<Statistics> stats = ceilometer.meters().statistics().execute(); // (new MeterStatistics().name(m.getName()));
+                       for(Statistics s : stats) {
+                               System.out.println("\t\t" + s);
+                       }
+                       
+                       
+               }
+               */
+               
+       }
+
+}
diff --git a/openstack-examples/src/main/java/com/woorea/openstack/examples/network/QuantumListNetworks.java b/openstack-examples/src/main/java/com/woorea/openstack/examples/network/QuantumListNetworks.java
new file mode 100644 (file)
index 0000000..8e218c2
--- /dev/null
@@ -0,0 +1,47 @@
+package com.woorea.openstack.examples.network;
+
+import com.woorea.openstack.keystone.utils.KeystoneUtils;
+
+import com.woorea.openstack.base.client.OpenStackSimpleTokenProvider;
+import com.woorea.openstack.examples.ExamplesConfiguration;
+import com.woorea.openstack.keystone.Keystone;
+import com.woorea.openstack.keystone.model.Access;
+import com.woorea.openstack.keystone.model.Tenants;
+import com.woorea.openstack.keystone.model.authentication.TokenAuthentication;
+import com.woorea.openstack.keystone.model.authentication.UsernamePassword;
+import com.woorea.openstack.quantum.Quantum;
+import com.woorea.openstack.quantum.model.Network;
+import com.woorea.openstack.quantum.model.Networks;
+
+public class QuantumListNetworks {
+
+       /**
+        * @param args
+        */
+       public static void main(String[] args) {
+               Keystone keystone = new Keystone(ExamplesConfiguration.KEYSTONE_AUTH_URL);
+               // access with unscoped token
+               Access access = keystone.tokens().authenticate(
+                               new UsernamePassword(ExamplesConfiguration.KEYSTONE_USERNAME, ExamplesConfiguration.KEYSTONE_PASSWORD))
+                               .execute();
+               // use the token in the following requests
+               keystone.setTokenProvider(new OpenStackSimpleTokenProvider(access.getToken().getId()));
+
+               Tenants tenants = keystone.tenants().list().execute();
+               // try to exchange token using the first tenant
+               if (tenants.getList().size() > 0) {
+                       // access with tenant
+                       access = keystone.tokens().authenticate(new TokenAuthentication(access.getToken().getId())).withTenantId(tenants.getList().get(0).getId()).execute();
+
+                       Quantum quantum = new Quantum(KeystoneUtils.findEndpointURL(access.getServiceCatalog(), "network",      null, "public"));
+                       quantum.setTokenProvider(new OpenStackSimpleTokenProvider(access.getToken().getId()));
+
+                       Networks networks = quantum.networks().list().execute();
+                       for (Network network : networks) {
+                               System.out.println(network);
+                       }
+               } else {
+                       System.out.println("No tenants found!");
+               }
+       }
+}
diff --git a/openstack-examples/src/main/java/com/woorea/openstack/examples/network/QuantumNetworkCreate.java b/openstack-examples/src/main/java/com/woorea/openstack/examples/network/QuantumNetworkCreate.java
new file mode 100644 (file)
index 0000000..7f4dff0
--- /dev/null
@@ -0,0 +1,108 @@
+package com.woorea.openstack.examples.network;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Scanner;
+
+import com.woorea.openstack.keystone.utils.KeystoneUtils;
+
+import com.woorea.openstack.base.client.OpenStackSimpleTokenProvider;
+import com.woorea.openstack.examples.ExamplesConfiguration;
+import com.woorea.openstack.keystone.Keystone;
+import com.woorea.openstack.keystone.model.Access;
+import com.woorea.openstack.keystone.model.Tenant;
+import com.woorea.openstack.keystone.model.Tenants;
+import com.woorea.openstack.keystone.model.authentication.TokenAuthentication;
+import com.woorea.openstack.keystone.model.authentication.UsernamePassword;
+import com.woorea.openstack.quantum.Quantum;
+import com.woorea.openstack.quantum.api.NetworksResource;
+import com.woorea.openstack.quantum.api.NetworksResource.Create;
+import com.woorea.openstack.quantum.model.Network;
+import com.woorea.openstack.quantum.model.NetworkForCreate;
+import com.woorea.openstack.quantum.model.Networks;
+import com.woorea.openstack.quantum.model.Port;
+import com.woorea.openstack.quantum.model.PortForCreate;
+import com.woorea.openstack.quantum.model.Router;
+import com.woorea.openstack.quantum.model.RouterForAddInterface;
+import com.woorea.openstack.quantum.model.RouterForCreate;
+import com.woorea.openstack.quantum.model.Subnet;
+import com.woorea.openstack.quantum.model.SubnetForCreate;
+import com.woorea.openstack.quantum.model.Subnets;
+
+public class QuantumNetworkCreate {
+
+       /**
+        * @param args
+        */
+       public static void main(String[] args) {
+               Keystone keystone = new Keystone(
+                               ExamplesConfiguration.KEYSTONE_AUTH_URL);
+               // access with unscoped token
+               Access access = keystone
+                               .tokens()
+                               .authenticate(
+                                               new UsernamePassword(
+                                                               ExamplesConfiguration.KEYSTONE_USERNAME,
+                                                               ExamplesConfiguration.KEYSTONE_PASSWORD))
+                               .execute();
+               // use the token in the following requests
+               keystone.setTokenProvider(new OpenStackSimpleTokenProvider(access
+                               .getToken().getId()));
+               keystone.token(access.getToken().getId());
+               Tenants tenants = keystone.tenants().list().execute();
+               // try to exchange token using the first tenant
+
+               if (tenants.getList().size() > 0) {
+                       // access with tenant
+                       Network network = new Network();
+                       access = keystone
+                                       .tokens()
+                                       .authenticate(
+                                                       new TokenAuthentication(access.getToken().getId()))
+                                       .withTenantId("tenantId").execute();
+                       Quantum quantum = new Quantum(KeystoneUtils.findEndpointURL(
+                                       access.getServiceCatalog(), "network", null, "public"));
+                       quantum.setTokenProvider(new OpenStackSimpleTokenProvider(access
+                                       .getToken().getId()));
+                       NetworkForCreate netcreate = new NetworkForCreate();
+                       netcreate.setTenantId("tenantId");
+                       netcreate.setName("net2");
+                       netcreate.setAdminStateUp(true);
+
+                       network = quantum.networks().create(netcreate).execute();
+
+                       // Creating Subnet
+                       try {
+                               Subnet sub = new Subnet();
+                               SubnetForCreate subnet = new SubnetForCreate();
+                               subnet.setCidr("");
+                               subnet.setName("");
+                               subnet.setNetworkId(network.getId());
+                               subnet.setIpVersion(4);
+                               sub = quantum.subnets().create(subnet).execute();
+                               RouterForCreate routerForCreate = new RouterForCreate();
+                               routerForCreate.setName("routerName");
+                               routerForCreate.setTenantId("tenantId");
+                               Router router = quantum.routers().create(routerForCreate)
+                                               .execute();
+                               RouterForAddInterface routerForAdd = new RouterForAddInterface();
+                               routerForAdd.setSubnetId(sub.getId());
+                               routerForAdd.setRouterId(router.getId());
+                               quantum.routers().addInterface(routerForAdd).execute();
+
+                               // System.out.println(sub);
+                       } catch (Exception e) {
+                               System.out.println(e.getMessage());
+                       }
+
+                       Networks networks = quantum.networks().list().execute();
+
+                       for (Network network1 : networks) {
+                               System.out.println(network1);
+                       }
+               } else {
+                       System.out.println("No tenants found!");
+               }
+
+       }
+}
diff --git a/openstack-examples/src/main/java/com/woorea/openstack/examples/network/QuantumQueryNetworks.java b/openstack-examples/src/main/java/com/woorea/openstack/examples/network/QuantumQueryNetworks.java
new file mode 100644 (file)
index 0000000..1a427ea
--- /dev/null
@@ -0,0 +1,59 @@
+package com.woorea.openstack.examples.network;
+
+import com.woorea.openstack.keystone.utils.KeystoneUtils;
+
+import com.woorea.openstack.base.client.OpenStackSimpleTokenProvider;
+import com.woorea.openstack.examples.ExamplesConfiguration;
+import com.woorea.openstack.keystone.Keystone;
+import com.woorea.openstack.keystone.model.Access;
+import com.woorea.openstack.keystone.model.Tenants;
+import com.woorea.openstack.keystone.model.authentication.TokenAuthentication;
+import com.woorea.openstack.keystone.model.authentication.UsernamePassword;
+import com.woorea.openstack.quantum.Quantum;
+import com.woorea.openstack.quantum.model.Network;
+
+public class QuantumQueryNetworks {
+
+       /**
+        * @param args
+        */
+       public static void main(String[] args) {
+               Keystone keystone = new Keystone(ExamplesConfiguration.KEYSTONE_AUTH_URL);
+               // access with unscoped token
+               Access access = keystone.tokens().authenticate(
+                               new UsernamePassword(ExamplesConfiguration.KEYSTONE_USERNAME, ExamplesConfiguration.KEYSTONE_PASSWORD))
+                               .execute();
+               // use the token in the following requests
+               keystone.setTokenProvider(new OpenStackSimpleTokenProvider(access.getToken().getId()));
+
+               Tenants tenants = keystone.tenants().list().execute();
+               // try to exchange token using the first tenant
+               if (tenants.getList().size() > 0) {
+                       // access with tenant
+                       access = keystone.tokens().authenticate(new TokenAuthentication(access.getToken().getId())).withTenantId(tenants.getList().get(0).getId()).execute();
+
+                       Quantum quantumClient = new Quantum(KeystoneUtils.findEndpointURL(access.getServiceCatalog(), "network",        null, "public"));
+                       quantumClient.setTokenProvider(new OpenStackSimpleTokenProvider(access.getToken().getId()));
+
+                       Network networkQuery = new Network();
+                       networkQuery.setName("benn.cs");
+                       networkQuery.setAdminStateUp(true);
+                       /*
+                       Networks networks = quantumClient.execute(NetworkQuery.queryNetworks(networkQuery));
+
+                       for (Network network : networks) {
+                               System.out.println(network);
+                       }
+
+                       Subnet subnetQuery = new Subnet();
+                       subnetQuery.setIpversion(Subnet.IpVersion.IPV4);
+                       Subnets Subnets = quantumClient.execute(NetworkQuery.querySubnets(subnetQuery));
+                       for (Subnet subnet : Subnets) {
+                               System.out.println(subnet);
+                       }
+                       */
+               } else {
+                       System.out.println("No tenants found!");
+               }
+       }
+}
diff --git a/openstack-examples/src/main/java/com/woorea/openstack/examples/objectstore/SwiftExample.java b/openstack-examples/src/main/java/com/woorea/openstack/examples/objectstore/SwiftExample.java
new file mode 100644 (file)
index 0000000..089163c
--- /dev/null
@@ -0,0 +1,90 @@
+package com.woorea.openstack.examples.objectstore;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import com.woorea.openstack.keystone.utils.KeystoneUtils;
+
+import com.woorea.openstack.base.client.OpenStackSimpleTokenProvider;
+import com.woorea.openstack.examples.ExamplesConfiguration;
+import com.woorea.openstack.keystone.Keystone;
+import com.woorea.openstack.keystone.model.Access;
+import com.woorea.openstack.keystone.model.Tenants;
+import com.woorea.openstack.keystone.model.authentication.TokenAuthentication;
+import com.woorea.openstack.keystone.model.authentication.UsernamePassword;
+import com.woorea.openstack.swift.Swift;
+import com.woorea.openstack.swift.model.ObjectDownload;
+import com.woorea.openstack.swift.model.ObjectForUpload;
+
+public class SwiftExample {
+       
+       private static final File TEST_FILE = new File("pom.xml");
+       
+       /**
+        * @param args
+        */
+       public static void main(String[] args) throws Exception {
+               Keystone keystone = new Keystone(ExamplesConfiguration.KEYSTONE_AUTH_URL);              
+               //access with unscoped token
+               Access access = keystone.tokens().authenticate(
+                               new UsernamePassword(ExamplesConfiguration.KEYSTONE_USERNAME, ExamplesConfiguration.KEYSTONE_PASSWORD))
+                               .execute();
+               
+               //use the token in the following requests
+               keystone.setTokenProvider(new OpenStackSimpleTokenProvider(access.getToken().getId()));
+               
+               Tenants tenants = keystone.tenants().list().execute();
+               
+               //try to exchange token using the first tenant
+               if(tenants.getList().size() > 0) {
+                       
+                       access = keystone.tokens().authenticate(new TokenAuthentication(access.getToken().getId())).withTenantId(tenants.getList().get(0).getId()).execute();
+                       
+                       Swift swift = new Swift(KeystoneUtils.findEndpointURL(access.getServiceCatalog(), "object-store", null, "public"));
+                       swift.setTokenProvider(new OpenStackSimpleTokenProvider(access.getToken().getId()));
+               
+                       //swiftClient.execute(new DeleteContainer("navidad2"));
+                       
+                       swift.containers().create("navidad2").execute();
+                       
+                       System.out.println(swift.containers().list());
+                       
+                       ObjectForUpload upload = new ObjectForUpload();
+                       upload.setContainer("navidad2");
+                       upload.setName("example2");
+                       upload.setInputStream(new FileInputStream(TEST_FILE));
+                       swift.containers().container("navidad2").upload(upload).execute();
+                       
+//                     System.out.println(swiftClient.execute(new ListObjects("navidad2", new HashMap<String, String>() {{
+//                             put("path", "");
+//                     }})).get(0).getContentType());
+                       
+                       
+                       ObjectDownload download = swift.containers().container("navidad").download("example2").execute();
+                       write(download.getInputStream(), "example2");
+               }
+
+       }
+       
+       private static void write(InputStream is, String path) {
+               try {
+                       OutputStream stream = new BufferedOutputStream(new FileOutputStream(path)); 
+                       int bufferSize = 1024;
+                       byte[] buffer = new byte[bufferSize];
+                       int len = 0;
+                       while ((len = is.read(buffer)) != -1) {
+                           stream.write(buffer, 0, len);
+                       }
+                       stream.close();   
+               } catch(IOException e) {
+                       throw new RuntimeException(e.getMessage(), e);
+               }
+               
+       }
+
+}
diff --git a/openstack-examples/src/main/java/com/woorea/openstack/examples/simple/OpenStackSimpleClient.java b/openstack-examples/src/main/java/com/woorea/openstack/examples/simple/OpenStackSimpleClient.java
new file mode 100644 (file)
index 0000000..c2e8023
--- /dev/null
@@ -0,0 +1,15 @@
+package com.woorea.openstack.examples.simple;
+
+
+public class OpenStackSimpleClient {
+
+       /**
+        * @param args
+        */
+       public static void main(String[] args) {
+//             OpenStackClient client = new OpenStackClient(ExamplesConfiguration.KEYSTONE_AUTH_URL);
+//             Access access = client.request("/tokens").execute("POST", Entity.json("{\"auth\":{\"passwordCredentials\":{\"username\":\"\",\"password\":\"\"}}}"), Access.class);
+//             System.out.println(access);
+       }
+
+}
diff --git a/openstack-java-sdk-master/.travis.yml b/openstack-java-sdk-master/.travis.yml
new file mode 100644 (file)
index 0000000..f2ad391
--- /dev/null
@@ -0,0 +1,3 @@
+language: java
+
+install: mvn clean package -DskipTests=true
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
new file mode 100644 (file)
index 0000000..d5b2874
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,150 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+       <modelVersion>4.0.0</modelVersion>
+
+       <groupId>org.openecomp.mso.libs</groupId>
+       <artifactId>openstack-java-sdk</artifactId>
+       <version>1.0.0-SNAPSHOT</version>
+       <packaging>pom</packaging>
+       <name>OpenStack Java SDK</name>
+       <description>OpenStack Java SDK</description>
+       <properties>
+               <skip.sign>false</skip.sign>
+       </properties>
+
+
+       <distributionManagement>
+               <repository>
+                       <id>mso-releases</id>
+                       <name>MSO Release Repository</name>
+                       <url>https://162.242.254.138:8443/repository/maven-releases/</url>
+               </repository>
+               <snapshotRepository>
+                       <id>mso-snapshots</id>
+                       <name>MSO Snapshot Repository</name>
+                       <url>https://162.242.254.138:8443/repository/maven-snapshots/</url>
+               </snapshotRepository>
+       </distributionManagement>
+
+       <modules>
+               <module>openstack-client</module>
+               <module>nova-model</module>
+               <module>nova-client</module>
+               <module>keystone-client</module>
+               <module>swift-client</module>
+               <module>quantum-client</module>
+               <module>heat-client</module>
+               <module>glance-model</module>
+               <module>glance-client</module>
+               <module>keystone-model</module>
+               <module>swift-model</module>
+               <module>quantum-model</module>
+               <module>ceilometer-model</module>
+               <module>ceilometer-client</module>
+               <module>openstack-client-connectors</module>
+               <module>heat-model</module>
+       </modules>
+
+       <!-- <profiles> <profile> <id>console</id> <activation> <activeByDefault>true</activeByDefault> 
+               </activation> <modules> <module>openstack-console</module> </modules> </profile> 
+               <profile> <id>examples</id> <activation> <activeByDefault>true</activeByDefault> 
+               </activation> <modules> <module>openstack-examples</module> </modules> </profile> 
+               </profiles> -->
+
+       <licenses>
+               <license>
+                       <name>Apache2</name>
+                       <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+               </license>
+       </licenses>
+
+       <inceptionYear>2012</inceptionYear>
+
+
+       <repositories>
+               <repository>
+                       <id>central</id>
+                       <name>Maven 2 repository</name>
+                       <url>http://repo2.maven.org/maven2/</url>
+               </repository>
+       </repositories>
+       <pluginRepositories>
+               <pluginRepository>
+                       <id>central</id>
+                       <name>Maven 2 plugin repository</name>
+                       <url>http://repo2.maven.org/maven2/</url>
+               </pluginRepository>
+       </pluginRepositories>
+
+       <dependencies>
+               <dependency>
+                       <groupId>org.codehaus.jackson</groupId>
+                       <artifactId>jackson-mapper-asl</artifactId>
+                       <version>1.9.13</version>
+               </dependency>
+       </dependencies>
+
+
+       <build>
+               <pluginManagement>
+                       <plugins>
+                               <plugin>
+                                       <groupId>org.apache.maven.plugins</groupId>
+                                       <artifactId>maven-surefire-plugin</artifactId>
+                                       <version>2.17</version>
+                               </plugin>
+                       </plugins>
+               </pluginManagement>
+               <!-- To use the plugin goals in your POM or parent POM -->
+               <plugins>
+               <plugin>
+                               <groupId>org.apache.maven.plugins</groupId>
+                               <artifactId>maven-surefire-plugin</artifactId>
+                               <version>2.17</version>
+                       </plugin>
+                       <plugin>
+                               <groupId>org.apache.maven.plugins</groupId>
+                               <artifactId>maven-deploy-plugin</artifactId>
+                               <version>2.8</version>
+                       </plugin>
+                       <plugin>
+                               <groupId>org.apache.maven.plugins</groupId>
+                               <artifactId>maven-compiler-plugin</artifactId>
+                               <version>3.1</version>
+                               <configuration>
+                                       <source>1.7</source>
+                                       <target>1.7</target>
+                                       <encoding>UTF-8</encoding>
+                               </configuration>
+                       </plugin>
+                       <!-- <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-gpg-plugin</artifactId> 
+                               <version>1.4</version> <configuration> <skip>${skip.sign}</skip> </configuration> 
+                               <executions> <execution> <id>sign-artifacts</id> <phase>verify</phase> <goals> 
+                               <goal>sign</goal> </goals> </execution> </executions> </plugin> -->
+                       <plugin>
+                               <groupId>org.apache.maven.plugins</groupId>
+                               <artifactId>maven-eclipse-plugin</artifactId>
+                               <version>2.9</version>
+                       </plugin>
+                       <plugin>
+                               <groupId>org.apache.maven.plugins</groupId>
+                               <artifactId>maven-resources-plugin</artifactId>
+                               <version>2.6</version>
+                       </plugin>
+                       <plugin>
+                               <groupId>org.apache.maven.plugins</groupId>
+                               <artifactId>maven-source-plugin</artifactId>
+                               <version>2.2.1</version>
+                               <executions>
+                                       <execution>
+                                               <id>attach-sources</id>
+                                               <phase>verify</phase>
+                                               <goals>
+                                                       <goal>jar-no-fork</goal>
+                                               </goals>
+                                       </execution>
+                               </executions>
+                       </plugin>
+               </plugins>
+       </build>
+</project>
\ No newline at end of file
diff --git a/project-configs/maven/conf/settings.xml b/project-configs/maven/conf/settings.xml
new file mode 100644 (file)
index 0000000..c5a82e3
--- /dev/null
@@ -0,0 +1,160 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor 
+       license agreements. See the NOTICE file distributed with this work for additional 
+       information regarding copyright ownership. The ASF licenses this file to 
+       you under the Apache License, Version 2.0 (the "License"); you may not use 
+       this file except in compliance with the License. You may obtain a copy of 
+       the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required 
+       by applicable law or agreed to in writing, software distributed under the 
+       License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 
+       OF ANY KIND, either express or implied. See the License for the specific 
+       language governing permissions and limitations under the License. -->
+
+
+<!-- Special settings file for the maven installation on AT&T central Jenkins -->
+
+
+<!-- | This is the configuration file for Maven. It can be specified at two 
+       levels: | | 1. User Level. This settings.xml file provides configuration 
+       for a single user, | and is normally provided in ${user.home}/.m2/settings.xml. 
+       | | NOTE: This location can be overridden with the CLI option: | | -s /path/to/user/settings.xml 
+       | | 2. Global Level. This settings.xml file provides configuration for all 
+       Maven | users on a machine (assuming they're all using the same Maven | installation). 
+       It's normally provided in | ${maven.home}/conf/settings.xml. | | NOTE: This 
+       location can be overridden with the CLI option: | | -gs /path/to/global/settings.xml 
+       | | The sections in this sample file are intended to give you a running start 
+       at | getting the most out of your Maven installation. Where appropriate, 
+       the default | values (values used when the setting is not specified) are 
+       provided. | | -->
+<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
+       <!-- localRepository | The path to the local repository maven will use to 
+               store artifacts. | | Default: ${user.home}/.m2/repository <localRepository>/path/to/local/repo</localRepository> -->
+       <localRepository>${user.home}/.m2/repository</localRepository>
+       <!-- interactiveMode | This will determine whether maven prompts you when 
+               it needs input. If set to false, | maven will use a sensible default value, 
+               perhaps based on some other setting, for | the parameter in question. | | 
+               Default: true <interactiveMode>true</interactiveMode> -->
+
+       <!-- offline | Determines whether maven should attempt to connect to the 
+               network when executing a build. | This will have an effect on artifact downloads, 
+               artifact deployment, and others. | | Default: false <offline>false</offline> -->
+
+       <!-- pluginGroups | This is a list of additional group identifiers that 
+               will be searched when resolving plugins by their prefix, i.e. | when invoking 
+               a command line like "mvn prefix:goal". Maven will automatically add the group 
+               identifiers | "org.apache.maven.plugins" and "org.codehaus.mojo" if these 
+               are not already contained in the list. | -->
+       <pluginGroups>
+               <!-- pluginGroup | Specifies a further group identifier to use for plugin 
+                       lookup. <pluginGroup>com.your.plugins</pluginGroup> -->
+       </pluginGroups>
+
+       <!-- proxies | This is a list of proxies which can be used on this machine 
+               to connect to the network. | Unless otherwise specified (by system property 
+               or command-line switch), the first proxy | specification in this list marked 
+               as active will be used. | -->
+       <proxies>
+               <proxy>
+                       <id>optional</id>
+                       <active>true</active>
+                       <protocol>http</protocol>
+                       <host>one.proxy.att.com</host>
+                       <port>8080</port>
+                       <nonProxyHosts>localhost,127.0.0.1,*.att.com</nonProxyHosts>
+               </proxy>
+       </proxies>
+
+       <!-- servers | This is a list of authentication profiles, keyed by the server-id 
+               used within the system. | Authentication profiles can be used whenever maven 
+               must make a connection to a remote server. | -->
+       <servers>
+               <!-- server | Specifies the authentication information to use when connecting 
+                       to a particular server, identified by | a unique name within the system (referred 
+                       to by the 'id' attribute below). | | NOTE: You should either specify username/password 
+                       OR privateKey/passphrase, since these pairings are | used together. | <server> 
+                       <id>deploymentRepo</id> <username>repouser</username> <password>repopwd</password> 
+                       </server> -->
+
+               <!-- Another sample, using keys to authenticate. <server> <id>siteServer</id> 
+                       <privateKey>/path/to/private/key</privateKey> <passphrase>optional; leave 
+                       empty if not used.</passphrase> </server> -->
+       </servers>
+
+       <!-- mirrors | This is a list of mirrors to be used in downloading artifacts 
+               from remote repositories. | | It works like this: a POM may declare a repository 
+               to use in resolving certain artifacts. | However, this repository may have 
+               problems with heavy traffic at times, so people have mirrored | it to several 
+               places. | | That repository definition will have a unique id, so we can create 
+               a mirror reference for that | repository, to be used as an alternate download 
+               site. The mirror site will be the preferred | server for that repository. 
+               | -->
+       <mirrors>
+               <!-- mirror | Specifies a repository mirror site to use instead of a given 
+                       repository. The repository that | this mirror serves has an ID that matches 
+                       the mirrorOf element of this mirror. IDs are used | for inheritance and direct 
+                       lookup purposes, and must be unique across the set of mirrors. | -->
+               <mirror>
+                       <id>Maven Central</id>
+                       <mirrorOf>central</mirrorOf>
+                       <name>AT&amp;T maven central mirror</name>
+                       <url>http://mavencentral.it.att.com:8084/nexus/content/groups/public/</url>
+               </mirror>
+
+
+       </mirrors>
+
+       <!-- profiles | This is a list of profiles which can be activated in a variety 
+               of ways, and which can modify | the build process. Profiles provided in the 
+               settings.xml are intended to provide local machine- | specific paths and 
+               repository locations which allow the build to work in the local environment. 
+               | | For example, if you have an integration testing plugin - like cactus 
+               - that needs to know where | your Tomcat instance is installed, you can provide 
+               a variable here such that the variable is | dereferenced during the build 
+               process to configure the cactus plugin. | | As noted above, profiles can 
+               be activated in a variety of ways. One way - the activeProfiles | section 
+               of this document (settings.xml) - will be discussed later. Another way essentially 
+               | relies on the detection of a system property, either matching a particular 
+               value for the property, | or merely testing its existence. Profiles can also 
+               be activated by JDK version prefix, where a | value of '1.4' might activate 
+               a profile when the build is executed on a JDK version of '1.4.2_07'. | Finally, 
+               the list of active profiles can be specified directly from the command line. 
+               | | NOTE: For profiles defined in the settings.xml, you are restricted to 
+               specifying only artifact | repositories, plugin repositories, and free-form 
+               properties to be used as configuration | variables for plugins in the POM. 
+               | | -->
+       <profiles>
+               <!-- profile | Specifies a set of introductions to the build process, to 
+                       be activated using one or more of the | mechanisms described above. For inheritance 
+                       purposes, and to activate profiles via <activatedProfiles/> | or the command 
+                       line, profiles have to have an ID that is unique. | | An encouraged best 
+                       practice for profile identification is to use a consistent naming convention 
+                       | for profiles, such as 'env-dev', 'env-test', 'env-production', 'user-jdcasey', 
+                       'user-brett', etc. | This will make it more intuitive to understand what 
+                       the set of introduced profiles is attempting | to accomplish, particularly 
+                       when you only have a list of profile id's for debug. | | This profile example 
+                       uses the JDK version to trigger activation, and provides a JDK-specific repo. 
+                       <profile> <id>jdk-1.4</id> <activation> <jdk>1.4</jdk> </activation> <repositories> 
+                       <repository> <id>jdk14</id> <name>Repository for JDK 1.4 builds</name> <url>http://www.myhost.com/maven/jdk14</url> 
+                       <layout>default</layout> <snapshotPolicy>always</snapshotPolicy> </repository> 
+                       </repositories> </profile> -->
+
+               <!-- | Here is another profile, activated by the system property 'target-env' 
+                       with a value of 'dev', | which provides a specific path to the Tomcat instance. 
+                       To use this, your plugin configuration | might hypothetically look like: 
+                       | | ... | <plugin> | <groupId>org.myco.myplugins</groupId> | <artifactId>myplugin</artifactId> 
+                       | | <configuration> | <tomcatLocation>${tomcatPath}</tomcatLocation> | </configuration> 
+                       | </plugin> | ... | | NOTE: If you just wanted to inject this configuration 
+                       whenever someone set 'target-env' to | anything, you could just leave off 
+                       the <value/> inside the activation-property. | <profile> <id>env-dev</id> 
+                       <activation> <property> <name>target-env</name> <value>dev</value> </property> 
+                       </activation> <properties> <tomcatPath>/path/to/tomcat/instance</tomcatPath> 
+                       </properties> </profile> -->
+       </profiles>
+
+       <!-- activeProfiles | List of profiles that are active for all builds. | 
+               <activeProfiles> <activeProfile>alwaysActiveProfile</activeProfile> <activeProfile>anotherAlwaysActiveProfile</activeProfile> 
+               </activeProfiles> -->
+</settings>
diff --git a/quantum-client/pom.xml b/quantum-client/pom.xml
new file mode 100644 (file)
index 0000000..1487637
--- /dev/null
@@ -0,0 +1,25 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+       <modelVersion>4.0.0</modelVersion>
+       <parent>
+               <groupId>org.openecomp.mso.libs</groupId>
+               <artifactId>openstack-java-sdk</artifactId>
+               <version>1.0.0-SNAPSHOT</version>
+       </parent>
+       <groupId>org.openecomp.mso.libs.openstack-java-sdk</groupId>
+       <artifactId>quantum-client</artifactId>
+       <name>OpenStack Quantum Client</name>
+       <description>OpenStack Quantum Client</description>
+       <dependencies>
+               <dependency>
+                       <groupId>org.openecomp.mso.libs.openstack-java-sdk</groupId>
+                       <artifactId>openstack-client</artifactId>
+                       <version>1.0.0-SNAPSHOT</version>
+               </dependency>
+               <dependency>
+                       <groupId>org.openecomp.mso.libs.openstack-java-sdk</groupId>
+                       <artifactId>quantum-model</artifactId>
+                       <version>1.0.0-SNAPSHOT</version>
+               </dependency>
+       </dependencies>
+       
+</project>
diff --git a/quantum-client/src/main/java/com/woorea/openstack/quantum/Quantum.java b/quantum-client/src/main/java/com/woorea/openstack/quantum/Quantum.java
new file mode 100644 (file)
index 0000000..ec9c40f
--- /dev/null
@@ -0,0 +1,51 @@
+package com.woorea.openstack.quantum;
+
+
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackClientConnector;
+import com.woorea.openstack.quantum.api.NetworksResource;
+import com.woorea.openstack.quantum.api.PortsResource;
+import com.woorea.openstack.quantum.api.RoutersResource;
+import com.woorea.openstack.quantum.api.SubnetsResource;
+
+
+public class Quantum extends OpenStackClient {
+       
+       private final NetworksResource NETWORKS;
+       
+       private final PortsResource PORTS;
+       
+       private final SubnetsResource SUBNETS;
+       private final RoutersResource ROUTERS;
+       
+       public Quantum(String endpoint, OpenStackClientConnector connector) {
+               super(endpoint, connector);
+               NETWORKS = new NetworksResource(this);
+               PORTS = new PortsResource(this);
+               SUBNETS = new SubnetsResource(this);
+               ROUTERS=new RoutersResource(this);      
+               
+       }
+       
+       public Quantum(String endpoint) {
+               this(endpoint, null);
+       }
+       
+       public NetworksResource networks() {
+               return NETWORKS;
+       }
+       
+       public PortsResource ports() {
+               return PORTS;
+       }
+       
+       public SubnetsResource subnets() {
+               return SUBNETS;
+       }
+       public RoutersResource routers()
+       {
+               return ROUTERS;
+       }
+       
+
+}
diff --git a/quantum-client/src/main/java/com/woorea/openstack/quantum/api/NetworksResource.java b/quantum-client/src/main/java/com/woorea/openstack/quantum/api/NetworksResource.java
new file mode 100644 (file)
index 0000000..97a919a
--- /dev/null
@@ -0,0 +1,84 @@
+package com.woorea.openstack.quantum.api;
+
+
+import com.woorea.openstack.base.client.Entity;
+import com.woorea.openstack.base.client.HttpMethod;
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.quantum.model.Network;
+import com.woorea.openstack.quantum.model.Networks;
+
+public class NetworksResource {
+
+       private final OpenStackClient CLIENT;
+
+       public NetworksResource(OpenStackClient client) {
+               CLIENT = client;
+       }
+
+       public List list() {
+               return new List();
+       }
+
+    public Create create(Network net) {
+               return new Create(net);
+       }
+
+    public Update update(Network net) {
+        return new Update(net);
+    }
+
+       public Delete delete(String netId){
+               return new Delete(netId);
+       }
+
+       public Show show(String netId){
+               return new Show(netId);
+       }
+
+       public class List extends OpenStackRequest<Networks> {
+
+               public List() {
+                   super(CLIENT, HttpMethod.GET, "networks", null, Networks.class);
+               }
+       }
+
+       public class Query extends OpenStackRequest<Networks> {
+
+               public Query(Network network) {
+                       //super(network);
+//                     target = target.path("v2.0").path("networks");
+//                     target = queryParam(target);
+//                     return target.request(MediaType.APPLICATION_JSON).get(Networks.class);
+               }
+       }
+
+
+       public class Create extends OpenStackRequest<Network> {
+
+        public Create(Network net) {
+                   super(CLIENT, HttpMethod.POST, "networks", Entity.json(net), Network.class);
+               }
+       }
+
+    public class Update extends OpenStackRequest<Network> {
+
+        public Update(Network net) {
+            super(CLIENT, HttpMethod.PUT, buildPath("networks/", net.getId()), Entity.json(net), Network.class);
+        }
+    }
+
+       public class Show extends OpenStackRequest<Network> {
+
+               public Show(String id) {
+                   super(CLIENT, HttpMethod.GET, buildPath("networks/", id), null, Network.class);
+               }
+       }
+
+       public class Delete extends OpenStackRequest<Void> {
+
+               public Delete(String id){
+                   super(CLIENT, HttpMethod.DELETE, buildPath("networks/", id), null, Void.class);
+               }
+       }
+}
diff --git a/quantum-client/src/main/java/com/woorea/openstack/quantum/api/PortsResource.java b/quantum-client/src/main/java/com/woorea/openstack/quantum/api/PortsResource.java
new file mode 100644 (file)
index 0000000..d14e860
--- /dev/null
@@ -0,0 +1,85 @@
+package com.woorea.openstack.quantum.api;
+
+
+import com.woorea.openstack.base.client.Entity;
+import com.woorea.openstack.base.client.HttpMethod;
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.quantum.model.Port;
+import com.woorea.openstack.quantum.model.Ports;
+
+public class PortsResource {
+
+       private final OpenStackClient CLIENT;
+
+       public PortsResource(OpenStackClient client) {
+               CLIENT = client;
+       }
+
+       public List list() {
+               return new List();
+       }
+
+       public Create create(Port port){
+               return new Create(port);
+       }
+
+       public Update update(Port port){
+           return new Update(port);
+       }
+
+       public Delete delete(String portId){
+               return new Delete(portId);
+       }
+
+       public Show show(String portId){
+               return new Show(portId);
+       }
+
+       public class List extends OpenStackRequest<Ports> {
+
+               public List() {
+                   super(CLIENT, HttpMethod.GET, "ports", null, Ports.class);
+               }
+       }
+
+       public class Query extends OpenStackRequest<Ports> {
+
+               public Query(Port port) {
+                       //super(port);
+//                     target = target.path("v2.0").path("ports");
+//                     target = queryParam(target);
+//                     return target.request(MediaType.APPLICATION_JSON).get(Ports.class);
+               }
+
+       }
+
+
+       public class Create extends OpenStackRequest<Port> {
+
+               public Create(Port port){
+                   super(CLIENT, HttpMethod.POST, "ports", Entity.json(port), Port.class);
+               }
+       }
+
+       public class Update extends OpenStackRequest<Port> {
+
+           public Update(Port port){
+               super(CLIENT, HttpMethod.PUT, buildPath("ports/", port.getId()), Entity.json(port), Port.class);
+           }
+       }
+
+       public class Show extends OpenStackRequest<Port> {
+
+               public Show(String id) {
+                   super(CLIENT, HttpMethod.GET, buildPath("ports/", id), null, Port.class);
+               }
+       }
+
+       public class Delete extends OpenStackRequest<Void> {
+
+               public Delete(String id){
+            super(CLIENT, HttpMethod.DELETE, buildPath("ports/", id), null, Void.class);
+               }
+       }
+}
diff --git a/quantum-client/src/main/java/com/woorea/openstack/quantum/api/RoutersResource.java b/quantum-client/src/main/java/com/woorea/openstack/quantum/api/RoutersResource.java
new file mode 100644 (file)
index 0000000..bcd646d
--- /dev/null
@@ -0,0 +1,102 @@
+package com.woorea.openstack.quantum.api;
+
+import com.woorea.openstack.base.client.Entity;
+import com.woorea.openstack.base.client.HttpMethod;
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.quantum.model.Router;
+import com.woorea.openstack.quantum.model.RouterForAddInterface;
+import com.woorea.openstack.quantum.model.RouterForCreate;
+import com.woorea.openstack.quantum.model.RouterInterface;
+import com.woorea.openstack.quantum.model.Routers;
+
+public class RoutersResource {
+
+               private final OpenStackClient CLIENT;
+
+               public RoutersResource(OpenStackClient client) {
+                       CLIENT = client;
+               }
+
+               public List list() {
+                       return new List();
+               }
+
+               public Create create(RouterForCreate router){
+                       return new Create(router);
+               }
+
+               public Delete delete(String netId){
+                       return new Delete(netId);
+               }
+
+               public Show show(String netId){
+                       return new Show(netId);
+               }
+
+               public class List extends OpenStackRequest<Routers> {
+
+                       public List() {
+                           super(CLIENT, HttpMethod.GET, "routers", null, Routers.class);
+                       }
+               }
+
+               public class Query extends OpenStackRequest<Routers> {
+
+                       public Query(Router router) {
+                               //super(network);
+//                             target = target.path("v2.0").path("networks");
+//                             target = queryParam(target);
+//                             return target.request(MediaType.APPLICATION_JSON).get(Networks.class);
+                       }
+               }
+               public class Create extends OpenStackRequest<Router> {
+
+                       public Create(RouterForCreate router){
+                           super(CLIENT, HttpMethod.POST, "routers", Entity.json(router), Router.class);
+                       }
+               }
+
+               
+
+               public class Show extends OpenStackRequest<Router> {
+
+                       public Show(String id) {
+                           super(CLIENT, HttpMethod.GET, buildPath("routers/", id), null, Router.class);
+                       }
+               }
+
+               public class Delete extends OpenStackRequest<Void> {
+
+                       public Delete(String id){
+                           super(CLIENT, HttpMethod.DELETE, buildPath("routers/", id), null, Void.class);
+                       }
+               }
+               public Attach addInterface(RouterForAddInterface interfaceToAdd){
+                       return new Attach(interfaceToAdd);
+               }
+               public class Attach extends OpenStackRequest<RouterInterface> {
+
+                       public Attach(RouterForAddInterface interfaceToAdd){
+                           super(CLIENT, HttpMethod.PUT, buildPath("routers/",interfaceToAdd.getRouterId(),"/add_router_interface"), Entity.json(interfaceToAdd),RouterInterface.class);
+                       }       
+                       
+               }
+               public Detach deleteInterface(RouterForAddInterface interfaceRouter) {
+                       return new Detach(interfaceRouter);
+               }
+
+               public class Detach extends OpenStackRequest<RouterInterface> {
+
+               public Detach(RouterForAddInterface interfaceToAdd) {
+                       super(CLIENT, HttpMethod.PUT, buildPath("routers/",
+                                       interfaceToAdd.getRouterId(), "/remove_router_interface"),
+                                       Entity.json(interfaceToAdd), RouterInterface.class);
+               }
+
+       }
+
+       
+               
+
+}
diff --git a/quantum-client/src/main/java/com/woorea/openstack/quantum/api/SubnetsResource.java b/quantum-client/src/main/java/com/woorea/openstack/quantum/api/SubnetsResource.java
new file mode 100644 (file)
index 0000000..1864604
--- /dev/null
@@ -0,0 +1,84 @@
+package com.woorea.openstack.quantum.api;
+
+
+import com.woorea.openstack.base.client.Entity;
+import com.woorea.openstack.base.client.HttpMethod;
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.quantum.model.Subnet;
+import com.woorea.openstack.quantum.model.Subnets;
+
+public class SubnetsResource {
+
+       private final OpenStackClient CLIENT;
+
+       public SubnetsResource(OpenStackClient client) {
+               CLIENT = client;
+       }
+
+       public List list() {
+               return new List();
+       }
+
+    public Create create(Subnet net) {
+               return new Create(net);
+       }
+
+    public Update update(Subnet net) {
+        return new Update(net);
+    }
+
+       public Delete delete(String netId){
+               return new Delete(netId);
+       }
+
+       public Show show(String netId){
+               return new Show(netId);
+       }
+
+       public class List extends OpenStackRequest<Subnets> {
+
+               public List() {
+                   super(CLIENT, HttpMethod.GET, "subnets", null, Subnets.class);
+               }
+       }
+
+       public class Query extends OpenStackRequest<Subnets> {
+
+               public Query(Subnet subnet) {
+                       //super(subnet);
+//                     target = target.path("v2.0").path("subnets");
+//                     target = queryParam(target);
+//                     return target.request(MediaType.APPLICATION_JSON).get(Subnets.class);
+               }
+       }
+
+
+       public class Create extends OpenStackRequest<Subnet> {
+
+        public Create(Subnet subnet) {
+                   super(CLIENT, HttpMethod.POST, "subnets", Entity.json(subnet), Subnet.class);
+               }
+       }
+
+    public class Update extends OpenStackRequest<Subnet> {
+
+        public Update(Subnet subnet) {
+            super(CLIENT, HttpMethod.PUT, buildPath("subnets/", subnet.getId()), Entity.json(subnet), Subnet.class);
+        }
+    }
+
+       public class Show extends OpenStackRequest<Subnet> {
+
+               public Show(String id) {
+            super(CLIENT, HttpMethod.GET, buildPath("subnets/", id), null, Subnet.class);
+               }
+       }
+
+       public class Delete extends OpenStackRequest<Void> {
+
+               public Delete(String id){
+            super(CLIENT, HttpMethod.DELETE, buildPath("subnets/", id), null, Void.class);
+               }
+       }
+}
diff --git a/quantum-client/src/main/java/com/woorea/openstack/quantum/api/query/AbsOpenStackCmd.java b/quantum-client/src/main/java/com/woorea/openstack/quantum/api/query/AbsOpenStackCmd.java
new file mode 100644 (file)
index 0000000..8de5abf
--- /dev/null
@@ -0,0 +1,80 @@
+package com.woorea.openstack.quantum.api.query;
+
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+import com.woorea.openstack.base.client.OpenStackRequest;
+
+public class AbsOpenStackCmd<T> extends OpenStackRequest<T> {
+
+       private T query;
+
+       protected AbsOpenStackCmd(T query)
+       {
+               this.setQuery(query);
+       }
+
+       /**
+        * @param query the query to set
+        */
+       public void setQuery(T query) {
+               this.query = query;
+       }
+
+       /**
+        * @return the query
+        */
+       public T getQuery() {
+               return query;
+       }
+
+       private String getFieldValue(Field field, T target)
+       {
+               try {
+                       field.setAccessible(true);
+                       Object obj = field.get(target);
+                       if (obj == null)
+                               return null;
+                       return obj.toString();
+               } catch (Exception e) {
+                       throw new RuntimeException(e);
+               }
+       }
+
+       private Map<String, String> getObjectParamMap(T target)
+       {
+               Map<String, String> resultMap = new HashMap<String, String>();
+               if (target == null)
+                       return resultMap;
+
+               Field[] paramMap = target.getClass().getDeclaredFields();
+               for (Field field : paramMap) {
+                       String resultName = field.getName();
+                       String value = getFieldValue(field, target);
+                       if (value != null) {
+                               JsonProperty prop = field.getAnnotation(JsonProperty.class);
+                               if (prop != null) {
+                                       resultMap.put(prop.value(), getFieldValue(field, target));
+                               } else {
+                                       resultMap.put(resultName, getFieldValue(field, target));
+                               }
+                       }
+               }
+
+               return resultMap;
+       }
+
+       /*
+       public WebTarget queryParam(WebTarget target) {
+               Map<String, String> map = getObjectParamMap(this.query);
+               for (String fieldName : map.keySet()) {
+                       target = target.queryParam(fieldName, map.get(fieldName));
+               }
+               return target;
+       }
+       */
+
+}
diff --git a/quantum-model/pom.xml b/quantum-model/pom.xml
new file mode 100644 (file)
index 0000000..efed855
--- /dev/null
@@ -0,0 +1,20 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+       <modelVersion>4.0.0</modelVersion>
+       <parent>
+               <groupId>org.openecomp.mso.libs</groupId>
+               <artifactId>openstack-java-sdk</artifactId>
+               <version>1.0.0-SNAPSHOT</version>
+       </parent>
+       <groupId>org.openecomp.mso.libs.openstack-java-sdk</groupId>
+       <artifactId>quantum-model</artifactId>
+       <name>OpenStack Quantum Model</name>
+       <description>OpenStack Quantum Model</description>
+       <dependencies>
+           <dependency>
+                       <groupId>junit</groupId>
+                       <artifactId>junit</artifactId>
+                       <version>4.11</version>
+                       <scope>test</scope>
+           </dependency>
+  </dependencies>
+</project>
diff --git a/quantum-model/src/main/java/com/woorea/openstack/quantum/model/GatewayInfo.java b/quantum-model/src/main/java/com/woorea/openstack/quantum/model/GatewayInfo.java
new file mode 100644 (file)
index 0000000..2a7766f
--- /dev/null
@@ -0,0 +1,24 @@
+package com.woorea.openstack.quantum.model;
+
+import java.util.List;
+import java.io.Serializable;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class GatewayInfo implements Serializable {
+
+       @JsonProperty("network_id")
+       private String networkId;
+
+       public String getNetworkId() {
+               return networkId;
+       }
+
+       public void setNetworkId(String id) {
+               this.networkId = id;
+       }
+
+       @Override public String toString() {
+               return "[networkId=" + networkId + "]";
+       }
+}
diff --git a/quantum-model/src/main/java/com/woorea/openstack/quantum/model/HostRoute.java b/quantum-model/src/main/java/com/woorea/openstack/quantum/model/HostRoute.java
new file mode 100644 (file)
index 0000000..979add3
--- /dev/null
@@ -0,0 +1,27 @@
+package com.woorea.openstack.quantum.model;
+
+import java.io.Serializable;
+
+public class HostRoute implements Serializable {
+
+       private String destination;
+       private String nexthop;
+
+       public String getDestination() {
+               return destination;
+       }
+       public void setDestination(String destination) {
+               this.destination = destination;
+       }
+
+       public String getNexthop() {
+               return nexthop;
+       }
+       public void setNexthop(String nexthop) {
+               this.nexthop = nexthop;
+       }
+
+       @Override public String toString() {
+               return "[destination=" + destination + ", nexthop=" + nexthop + "]";
+       }
+}
diff --git a/quantum-model/src/main/java/com/woorea/openstack/quantum/model/Network.java b/quantum-model/src/main/java/com/woorea/openstack/quantum/model/Network.java
new file mode 100644 (file)
index 0000000..f880619
--- /dev/null
@@ -0,0 +1,321 @@
+package com.woorea.openstack.quantum.model;
+
+/*
+ * Modifications copyright (c) 2017 AT&T Intellectual Property
+ */
+
+import java.io.Serializable;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonIgnore;
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+/**
+ * Network Extension supporting both Provider networks and Multi-Provider networks.
+ * The attributes for both of these network extensions are included.
+ * It is the responsibility of users to populate only one or the other.  It is
+ * also critical that the Mapper is set for serialization inclusion.NON_NULL, or
+ * both would be sent to Openstack which would cause an error.
+ * 
+ */
+@SuppressWarnings("serial")
+@JsonRootName("network")
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class Network implements Serializable {
+
+    private String status;
+
+    private List<String> subnets;
+
+    private String name;
+
+    @JsonProperty("admin_state_up")
+    private Boolean adminStateUp;
+
+    @JsonProperty("tenant_id")
+    private String tenantId;
+
+    @JsonProperty("provider:physical_network")
+    private String providerPhysicalNetwork;
+
+    @JsonProperty("provider:network_type")
+    private String providerNetworkType;
+
+    @JsonProperty("provider:segmentation_id")
+    private Integer providerSegmentationId;
+
+    @JsonProperty("router:external")
+    private String routerExternal;
+
+    private String id;
+
+    private String shared;
+    
+    private List<Segment> segments;
+
+    /**
+     * @return the status
+     */
+    @JsonIgnore
+    public String getStatus() {
+        return status;
+    }
+
+    /**
+     * @param status
+     *            the status to set
+     */
+    @JsonProperty
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    /**
+     * @return the subnets
+     */
+    @JsonIgnore
+    public List<String> getSubnets() {
+        return subnets;
+    }
+
+    /**
+     * @param subnets
+     *            the subnets to set
+     */
+    @JsonProperty
+    public void setSubnets(List<String> subnets) {
+        this.subnets = subnets;
+    }
+
+    /**
+     * @return the name
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * @param name
+     *            the name to set
+     */
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    /**
+     * @return the providerPhyNet
+     * @deprecated
+     */
+    @Deprecated
+    @JsonIgnore
+    public String getProviderPhyNet() {
+        return getProviderPhysicalNetwork();
+    }
+
+    /**
+     * @param providerPhyNet
+     *            the providerPhyNet to set
+     * @deprecated
+     */
+    @Deprecated
+    @JsonIgnore
+    public void setProviderPhyNet(String providerPhyNet) {
+        setProviderPhysicalNetwork(providerPhyNet);
+    }
+
+    /**
+     * @return the adminStateUp
+     */
+    @JsonIgnore
+    public boolean isAdminStateUp() {
+        return adminStateUp;
+    }
+
+    public Boolean getAdminStateUp() {
+        return adminStateUp;
+    }
+
+    /**
+     * @param adminStateUp
+     *            the adminStateUp to set
+     */
+    public void setAdminStateUp(Boolean adminStateUp) {
+        this.adminStateUp = adminStateUp;
+    }
+
+    /**
+     * @return the tenantId
+     */
+    public String getTenantId() {
+        return tenantId;
+    }
+
+    /**
+     * @param tenantId
+     *            the tenantId to set
+     */
+    public void setTenantId(String tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    /**
+     * @return the netType
+     * @deprecated
+     */
+    @Deprecated
+    @JsonIgnore
+    public String getNetType() {
+        return getProviderNetworkType();
+    }
+
+    /**
+     * @param netType
+     *            the netType to set
+     * @deprecated
+     */
+    @Deprecated
+    @JsonIgnore
+    public void setNetType(String netType) {
+        setProviderNetworkType(netType);
+    }
+
+    /**
+     * @return the routerExternal
+     */
+    public String getRouterExternal() {
+        return routerExternal;
+    }
+
+    /**
+     * @param routerExternal
+     *            the routerExternal to set
+     */
+    public void setRouterExternal(String routerExternal) {
+        this.routerExternal = routerExternal;
+    }
+
+    /**
+     * @return the id
+     */
+    @JsonIgnore
+    public String getId() {
+        return id;
+    }
+
+    /**
+     * @param id
+     *            the id to set
+     */
+    @JsonProperty
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    /**
+     * @return the shared
+     */
+    public String getShared() {
+        return shared;
+    }
+
+    /**
+     * @param shared
+     *            the shared to set
+     */
+    public void setShared(String shared) {
+        this.shared = shared;
+    }
+
+    /**
+     * @return the providerSegID
+     * @deprecated
+     */
+    @Deprecated
+    @JsonIgnore
+    public String getProviderSegID() {
+        return getProviderSegmentationId() == null ? null : Integer.toString(getProviderSegmentationId());
+    }
+
+    /**
+     * @param providerSegID
+     *            the providerSegID to set
+     * @deprecated
+     */
+    @Deprecated
+    @JsonIgnore
+    public void setProviderSegID(String providerSegID) {
+        setProviderSegmentationId(providerSegID == null ? null : Integer.parseInt(providerSegID));
+    }
+
+    public String getProviderNetworkType() {
+        return providerNetworkType;
+    }
+
+    public void setProviderNetworkType(String providerNetworkType) {
+        this.providerNetworkType = providerNetworkType;
+    }
+
+    public String getProviderPhysicalNetwork() {
+        return providerPhysicalNetwork;
+    }
+
+    public void setProviderPhysicalNetwork(String providerPhysicalNetwork) {
+        this.providerPhysicalNetwork = providerPhysicalNetwork;
+    }
+
+    public Integer getProviderSegmentationId() {
+        return providerSegmentationId;
+    }
+
+    public void setProviderSegmentationId(Integer providerSegmentationId) {
+        this.providerSegmentationId = providerSegmentationId;
+    }
+
+    public List<Segment> getSegments() {
+        return segments;
+    }
+
+    public void setSegments(List<Segment> segments) {
+        this.segments = segments;
+    }
+
+    /**
+     * Function to detect and return the network type
+     */
+    public enum NetworkType { BASIC, PROVIDER, MULTI_PROVIDER };
+    
+    @JsonIgnore
+    public NetworkType getNetworkType () {
+       if (segments != null)
+               return NetworkType.MULTI_PROVIDER;
+       else if (providerNetworkType != null)
+               return NetworkType.PROVIDER;
+       else
+               return NetworkType.BASIC;
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see java.lang.Object#toString()
+     */
+    @Override
+    public String toString() {
+       StringBuffer buf = new StringBuffer("Network [id=" + id + ", name=" + name + ", subnets="
+                + subnets + ", status=" + status + ", admin_state_up=" + adminStateUp + ", tenant_id=" +
+                tenantId + ", shared=" + shared + ", router:external=" + routerExternal);
+       if (getNetworkType() == NetworkType.PROVIDER)
+               buf.append (", provider:physical_network=" + providerPhysicalNetwork +
+                ", provider:network_type=" + providerNetworkType  +
+                ", provider:segmentation_id=" + providerSegmentationId);
+       if (getNetworkType() == NetworkType.MULTI_PROVIDER) {
+               buf.append (", segments: ");
+               for (Segment s : segments)
+                       buf.append (s.toString()).append(" ");
+       }
+       buf.append ("]");
+       return buf.toString();
+    }
+}
diff --git a/quantum-model/src/main/java/com/woorea/openstack/quantum/model/NetworkForCreate.java b/quantum-model/src/main/java/com/woorea/openstack/quantum/model/NetworkForCreate.java
new file mode 100644 (file)
index 0000000..507e39b
--- /dev/null
@@ -0,0 +1,9 @@
+package com.woorea.openstack.quantum.model;
+
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@SuppressWarnings("serial")
+@JsonRootName("network")
+@Deprecated
+public class NetworkForCreate extends Network {
+}
diff --git a/quantum-model/src/main/java/com/woorea/openstack/quantum/model/Networks.java b/quantum-model/src/main/java/com/woorea/openstack/quantum/model/Networks.java
new file mode 100644 (file)
index 0000000..a4fd330
--- /dev/null
@@ -0,0 +1,38 @@
+package com.woorea.openstack.quantum.model;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class Networks implements Iterable<Network>, Serializable{
+       
+       @JsonProperty("networks")
+       private List<Network> list;
+
+       /**
+        * @return the list
+        */
+       public List<Network> getList() {
+               return list;
+       }
+
+
+       /**
+        * @param list the list to set
+        */
+       public void setList(List<Network> list) {
+               this.list = list;
+       }
+
+
+       public String toString() {
+               return "Networks [list=" + list + "]";
+       }
+
+
+       public Iterator<Network> iterator() {
+               return list.iterator();
+       }
+       
+}
diff --git a/quantum-model/src/main/java/com/woorea/openstack/quantum/model/NeutronError.java b/quantum-model/src/main/java/com/woorea/openstack/quantum/model/NeutronError.java
new file mode 100644 (file)
index 0000000..3fbd390
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ * ============LICENSE_START==========================================
+ * ===================================================================
+ * Copyright Â© 2017 AT&T Intellectual Property. All rights reserved.
+ * ===================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ *
+ */
+
+package com.woorea.openstack.quantum.model;
+
+import java.io.Serializable;
+
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("NeutronError")
+public class NeutronError implements Serializable {
+
+       private String type;
+       
+       private String message;
+
+       private String detail;
+       
+       /**
+        * @return the code
+        */
+       public String getType() {
+               return type;
+       }
+
+       /**
+        * @return the message
+        */
+       public String getMessage() {
+               return message;
+       }
+
+       /**
+        * @return the title
+        */
+       public String getDetail() {
+               return detail;
+       }
+
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "NeutronError [type=" + type + ", title=" + detail + ", message="
+                               + message + "]";
+       }
+       
+}
diff --git a/quantum-model/src/main/java/com/woorea/openstack/quantum/model/Pool.java b/quantum-model/src/main/java/com/woorea/openstack/quantum/model/Pool.java
new file mode 100644 (file)
index 0000000..d25bafe
--- /dev/null
@@ -0,0 +1,40 @@
+package com.woorea.openstack.quantum.model;
+
+import java.io.Serializable;
+
+public class Pool implements Serializable{
+       
+       private String start;
+       private String end;
+       
+       /**
+        * @return the start
+        */
+       public String getStart() {
+               return start;
+       }
+       /**
+        * @param start the start to set
+        */
+       public void setStart(String start) {
+               this.start = start;
+       }
+       /**
+        * @return the end
+        */
+       public String getEnd() {
+               return end;
+       }
+       /**
+        * @param end the end to set
+        */
+       public void setEnd(String end) {
+               this.end = end;
+       }
+       
+       @Override
+       public String toString() {
+               return "Allocation_pool [start=" + start + ", end=" + end + "]";
+       }
+       
+}
diff --git a/quantum-model/src/main/java/com/woorea/openstack/quantum/model/Port.java b/quantum-model/src/main/java/com/woorea/openstack/quantum/model/Port.java
new file mode 100644 (file)
index 0000000..8ca74f1
--- /dev/null
@@ -0,0 +1,373 @@
+package com.woorea.openstack.quantum.model;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+import org.codehaus.jackson.annotate.JsonIgnore;
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.annotate.JsonUnwrapped;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@SuppressWarnings("serial")
+@JsonRootName("port")
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class Port implements Serializable {
+
+    public static final class Ip implements Serializable {
+
+        @JsonProperty("ip_address")
+        private String address;
+
+        @JsonProperty("subnet_id")
+        private String subnetId;
+
+        /**
+         * @return the address
+         */
+        public String getAddress() {
+            return address;
+        }
+
+        /**
+         * @param address
+         *            the address to set
+         */
+        public void setAddress(String address) {
+            this.address = address;
+        }
+
+        /**
+         * @return the subnetId
+         */
+        public String getSubnetId() {
+            return subnetId;
+        }
+
+        /**
+         * @param subnetId
+         *            the subnetId to set
+         */
+        public void setSubnetId(String subnetId) {
+            this.subnetId = subnetId;
+        }
+
+        @Override
+        public String toString() {
+            return "ip_addresses [ip_address=" + address + ", subnet_id=" + subnetId + "]";
+        }
+
+    }
+
+    public static final class Binding {
+
+        /**
+         * The host on which the port will be allocated.
+         */
+        @JsonProperty("binding:host_id")
+        private String hostId;
+
+        /**
+         * The vif type for the specific port.
+         */
+        @JsonProperty("binding:vif_type")
+        private String vifType;
+
+        /**
+         * The type of vnic that this port should be attached to
+         */
+        @JsonProperty("binding:vnic_type")
+        private String vnicType;
+
+        /**
+         * A map containing additional information needed by the interface driver
+         */
+        @JsonProperty("binding:vif_details")
+        private Map<String, String> vifDetails;
+
+        /**
+         * A map to enable applications running on the specific host to pass and receive vif port specific information
+         * to the plugin.
+         */
+        @JsonProperty("binding:profile")
+        private Map<String, String> profile;
+
+        public String getHostId() {
+            return hostId;
+        }
+
+        public void setHostId(String hostId) {
+            this.hostId = hostId;
+        }
+
+        public String getVifType() {
+            return vifType;
+        }
+
+        public void setVifType(String vifType) {
+            this.vifType = vifType;
+        }
+
+        public String getVnicType() {
+            return vnicType;
+        }
+
+        public void setVnicType(String vnicType) {
+            this.vnicType = vnicType;
+        }
+
+        public Map<String, String> getVifDetails() {
+            return vifDetails;
+        }
+
+        public void setVifDetails(Map<String, String> vifDetails) {
+            this.vifDetails = vifDetails;
+        }
+
+        public Map<String, String> getProfile() {
+            return profile;
+        }
+
+        public void setProfile(Map<String, String> profile) {
+            this.profile = profile;
+        }
+
+        @Override
+        public String toString() {
+            return "Binding [hostId=" + hostId
+                    + ", vifType=" + vifType +
+                    ", vnicType=" + vnicType +
+                    ", vifDetails=" + vifDetails +
+                    ", profile=" + profile + "]";
+        }
+    }
+
+    @JsonProperty("admin_state_up")
+    private Boolean adminStateUp;
+
+    @JsonProperty("device_id")
+    private String deviceId;
+
+    @JsonProperty("device_owner")
+    private String deviceOwner;
+
+    @JsonProperty("fixed_ips")
+    private List<Ip> list;
+
+    private String id;
+
+    @JsonProperty("mac_address")
+    private String macAddress;
+
+    private String name;
+
+    @JsonProperty("network_id")
+    private String networkId;
+
+    private String status;
+
+    @JsonProperty("tenant_id")
+    private String tenantId;
+
+    @JsonProperty("security_groups")
+    private List<String> securityGroups;
+
+    @JsonUnwrapped
+    private Binding binding;
+
+    /**
+     * @return the adminStateUp
+     */
+    public Boolean getAdminStateUp() {
+        return adminStateUp;
+    }
+
+    /**
+     * @param adminStateUp
+     *            the adminStateUp to set
+     */
+    public void setAdminStateUp(Boolean adminStateUp) {
+        this.adminStateUp = adminStateUp;
+    }
+
+    /**
+     * @return the deviceId
+     */
+    public String getDeviceId() {
+        return deviceId;
+    }
+
+    /**
+     * @param deviceId
+     *            the deviceId to set
+     */
+    public void setDeviceId(String deviceId) {
+        this.deviceId = deviceId;
+    }
+
+    /**
+     * @return the deviceOwner
+     */
+    public String getDeviceOwner() {
+        return deviceOwner;
+    }
+
+    /**
+     * @param deviceOwner
+     *            the deviceOwner to set
+     */
+    public void setDeviceOwner(String deviceOwner) {
+        this.deviceOwner = deviceOwner;
+    }
+
+    /**
+     * @return the list
+     */
+    public List<Ip> getList() {
+        return list;
+    }
+
+    /**
+     * @param list
+     *            the list to set
+     */
+    public void setList(List<Ip> list) {
+        this.list = list;
+    }
+
+    /**
+     * @return the id
+     */
+    @JsonIgnore
+    public String getId() {
+        return id;
+    }
+
+    /**
+     * @param id
+     *            the id to set
+     */
+    @JsonProperty
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    /**
+     * @return the macAddress
+     */
+    public String getMacAddress() {
+        return macAddress;
+    }
+
+    /**
+     * @param macAddress
+     *            the macAddress to set
+     */
+    public void setMacAddress(String macAddress) {
+        this.macAddress = macAddress;
+    }
+
+    /**
+     * @return the name
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * @param name
+     *            the name to set
+     */
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    /**
+     * @return the networkId
+     */
+    public String getNetworkId() {
+        return networkId;
+    }
+
+    /**
+     * @param networkId
+     *            the networkId to set
+     */
+    public void setNetworkId(String networkId) {
+        this.networkId = networkId;
+    }
+
+    /**
+     * @return the status
+     */
+    @JsonIgnore
+    public String getStatus() {
+        return status;
+    }
+
+    /**
+     * @param status
+     *            the status to set
+     */
+    @JsonProperty
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    /**
+     * @return the tenantId
+     */
+    public String getTenantId() {
+        return tenantId;
+    }
+
+    /**
+     * @param tenantId
+     *            the tenantId to set
+     */
+    public void setTenantId(String tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    /**
+     * @return the associated security group IDs
+     */
+    public List<String> getSecurityGroups() {
+        return securityGroups;
+    }
+
+    /**
+     * @param securityGroups
+     *            IDs of security groups to associate to the port
+     */
+    public void setSecurityGroups(List<String> securityGroups) {
+        this.securityGroups = securityGroups;
+    }
+
+    /**
+     * @return the binding of the port
+     */
+    public Binding getBinding() {
+        return binding;
+    }
+
+    /**
+     * @param binding
+     *            The port bindings by which the port is bind to network on host
+     */
+    public void setBinding(Binding binding) {
+        this.binding = binding;
+    }
+
+    @Override
+    public String toString() {
+        return "Port [id=" + id + ", name=" + name + ", mac_address="
+                + macAddress + ", admin_state_up=" + adminStateUp + ", device_id=" + deviceId
+                + ", device_owner=" + deviceOwner + ", fixed_ips=" + list
+                + ", network_id=" + networkId + ", status=" + status
+                + ", tenant_id=" + tenantId
+                + ", securityGroups=" + securityGroups
+                + ", binding=" + binding + "]";
+    }
+}
diff --git a/quantum-model/src/main/java/com/woorea/openstack/quantum/model/PortForCreate.java b/quantum-model/src/main/java/com/woorea/openstack/quantum/model/PortForCreate.java
new file mode 100644 (file)
index 0000000..3c1af50
--- /dev/null
@@ -0,0 +1,12 @@
+package com.woorea.openstack.quantum.model;
+
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+/**
+ * @deprecated Please use {@link Port} directly.
+ */
+@SuppressWarnings("serial")
+@JsonRootName("port")
+@Deprecated
+public class PortForCreate extends Port {
+}
diff --git a/quantum-model/src/main/java/com/woorea/openstack/quantum/model/Ports.java b/quantum-model/src/main/java/com/woorea/openstack/quantum/model/Ports.java
new file mode 100644 (file)
index 0000000..5f10d35
--- /dev/null
@@ -0,0 +1,40 @@
+package com.woorea.openstack.quantum.model;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+@SuppressWarnings("serial")
+public class Ports implements Iterable<Port>, Serializable {
+
+    @JsonProperty("ports")
+    private List<Port> list;
+
+    /**
+     * @return the list
+     */
+    public List<Port> getList() {
+        return list;
+    }
+
+    /**
+     * @param list
+     *            the list to set
+     */
+    public void setList(List<Port> list) {
+        this.list = list;
+    }
+
+    @Override
+    public Iterator<Port> iterator() {
+        return list.iterator();
+    }
+
+    @Override
+    public String toString() {
+        return "Ports [list=" + list + "]";
+    }
+
+}
diff --git a/quantum-model/src/main/java/com/woorea/openstack/quantum/model/Router.java b/quantum-model/src/main/java/com/woorea/openstack/quantum/model/Router.java
new file mode 100644 (file)
index 0000000..a94afd5
--- /dev/null
@@ -0,0 +1,77 @@
+package com.woorea.openstack.quantum.model;
+
+import java.util.List;
+import java.io.Serializable;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("router")
+public class Router implements Serializable {
+
+       @JsonProperty("status")
+       private String status;
+
+       @JsonProperty("external_gateway_info")
+       private GatewayInfo externalGatewayInfo;
+
+       @JsonProperty("name")
+       private String name;
+
+       @JsonProperty("admin_state_up")
+       private String admin_state_up;
+
+       @JsonProperty("tenant_id")
+       private String tenantId;
+
+       @JsonProperty("id")
+       private String id;
+
+       @JsonProperty("routes")
+       private List<HostRoute> routes;
+
+       public String getName() {
+               return name;
+       }
+       public void setName(String name) {
+               this.name = name;
+       }
+       public List<HostRoute> getRoutes() {
+               return routes;
+       }
+       public void setRoutes(List<HostRoute> routes) {
+               this.routes = routes;
+       }
+       public String getAdmin_state_up() {
+               return admin_state_up;
+       }
+       public void setAdmin_state_up(String admin_state_up) {
+               this.admin_state_up = admin_state_up;
+       }
+       public String getStatus() {
+               return status;
+       }
+       public void setStatus(String status) {
+               this.status = status;
+       }
+       public GatewayInfo getExternalGatewayInfo() {
+               return externalGatewayInfo;
+       }
+       public void setExternalGatewayInfo(GatewayInfo externalGatewayInfo) {
+               this.externalGatewayInfo = externalGatewayInfo;
+       }
+       public String getTenantId() {
+               return tenantId;
+       }
+       public void setTenantId(String tenantId) {
+               this.tenantId = tenantId;
+       }
+       public String getId() {
+               return id;
+       }
+       public void setId(String id) {
+               this.id = id;
+       }
+       
+
+}
diff --git a/quantum-model/src/main/java/com/woorea/openstack/quantum/model/RouterForAddInterface.java b/quantum-model/src/main/java/com/woorea/openstack/quantum/model/RouterForAddInterface.java
new file mode 100644 (file)
index 0000000..62ec302
--- /dev/null
@@ -0,0 +1,28 @@
+package com.woorea.openstack.quantum.model;
+
+import java.io.Serializable;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class RouterForAddInterface implements Serializable {
+
+               @JsonProperty("subnet_id")
+               String subnetId;
+               String routerId;
+
+               public String getSubnetId() {
+                       return subnetId;
+               }
+
+               public void setSubnetId(String subnetId) {
+                       this.subnetId = subnetId;
+               }
+
+               public String getRouterId() {
+                       return routerId;
+               }
+
+               public void setRouterId(String routerId) {
+                       this.routerId = routerId;
+               }
+       }
diff --git a/quantum-model/src/main/java/com/woorea/openstack/quantum/model/RouterForCreate.java b/quantum-model/src/main/java/com/woorea/openstack/quantum/model/RouterForCreate.java
new file mode 100644 (file)
index 0000000..b8c9291
--- /dev/null
@@ -0,0 +1,75 @@
+package com.woorea.openstack.quantum.model;
+
+import java.util.List;
+import java.io.Serializable;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@JsonRootName("router")
+public class RouterForCreate implements Serializable {
+
+       @JsonProperty("name")
+       private String name;
+
+       private List<HostRoute> routes;
+
+       @JsonProperty("admin_state_up")
+       private String admin_state_up;
+
+       @JsonProperty("status")
+       private String status;
+
+       @JsonProperty("external_gateway_info")
+       private GatewayInfo externalGatewayInfo;
+
+       @JsonProperty("tenant_id")
+       private String tenantId;
+
+       @JsonProperty("id")
+       private String id;
+
+       public String getName() {
+               return name;
+       }
+       public void setName(String name) {
+               this.name = name;
+       }
+       public List<HostRoute> getRoutes() {
+               return routes;
+       }
+       public void setRoutes(List<HostRoute> routes) {
+               this.routes = routes;
+       }
+       public String getAdmin_state_up() {
+               return admin_state_up;
+       }
+       public void setAdmin_state_up(String admin_state_up) {
+               this.admin_state_up = admin_state_up;
+       }
+       public String getStatus() {
+               return status;
+       }
+       public void setStatus(String status) {
+               this.status = status;
+       }
+       public GatewayInfo getExternalGatewayInfo() {
+               return externalGatewayInfo;
+       }
+       public void setExternalGatewayInfo(GatewayInfo externalGatewayInfo) {
+               this.externalGatewayInfo = externalGatewayInfo;
+       }
+       public String getTenantId() {
+               return tenantId;
+       }
+       public void setTenantId(String tenantId) {
+               this.tenantId = tenantId;
+       }
+       public String getId() {
+               return id;
+       }
+       public void setId(String id) {
+               this.id = id;
+       }
+       
+}
diff --git a/quantum-model/src/main/java/com/woorea/openstack/quantum/model/RouterInterface.java b/quantum-model/src/main/java/com/woorea/openstack/quantum/model/RouterInterface.java
new file mode 100644 (file)
index 0000000..2d7551f
--- /dev/null
@@ -0,0 +1,19 @@
+package com.woorea.openstack.quantum.model;
+
+import java.io.Serializable;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+public class RouterInterface implements Serializable {
+
+       @JsonProperty("subnet_id")
+       String subnetId;
+       @JsonProperty("port_id")
+       String portId;
+       @JsonProperty("tenant_id")
+       String tenantId;
+       @JsonProperty("id")
+       String id;
+
+}
diff --git a/quantum-model/src/main/java/com/woorea/openstack/quantum/model/Routers.java b/quantum-model/src/main/java/com/woorea/openstack/quantum/model/Routers.java
new file mode 100644 (file)
index 0000000..e2a56b2
--- /dev/null
@@ -0,0 +1,38 @@
+package com.woorea.openstack.quantum.model;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class Routers implements Iterable<Router>, Serializable{
+       
+       @JsonProperty("routers")
+       private List<Router> list;
+
+       /**
+        * @return the list
+        */
+       public List<Router> getList() {
+               return list;
+       }
+
+
+       /**
+        * @param list the list to set
+        */
+       public void setList(List<Router> list) {
+               this.list = list;
+       }
+
+
+       public String toString() {
+               return "Routers [list=" + list + "]";
+       }
+
+
+       public Iterator<Router> iterator() {
+               return list.iterator();
+       }
+       
+}
diff --git a/quantum-model/src/main/java/com/woorea/openstack/quantum/model/Segment.java b/quantum-model/src/main/java/com/woorea/openstack/quantum/model/Segment.java
new file mode 100644 (file)
index 0000000..de78967
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * ============LICENSE_START==========================================
+ * ===================================================================
+ * Copyright Â© 2017 AT&T Intellectual Property. All rights reserved.
+ * ===================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ *
+ */
+
+package com.woorea.openstack.quantum.model;
+
+import java.io.Serializable;
+
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+
+@SuppressWarnings("serial")
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class Segment implements Serializable {
+
+    @JsonProperty("provider:physical_network")
+    private String providerPhysicalNetwork;
+
+    @JsonProperty("provider:network_type")
+    private String providerNetworkType;
+
+    @JsonProperty("provider:segmentation_id")
+    private Integer providerSegmentationId;
+
+    public String getProviderNetworkType() {
+        return providerNetworkType;
+    }
+
+    public void setProviderNetworkType(String providerNetworkType) {
+        this.providerNetworkType = providerNetworkType;
+    }
+
+    public String getProviderPhysicalNetwork() {
+        return providerPhysicalNetwork;
+    }
+
+    public void setProviderPhysicalNetwork(String providerPhysicalNetwork) {
+        this.providerPhysicalNetwork = providerPhysicalNetwork;
+    }
+
+    public Integer getProviderSegmentationId() {
+        return providerSegmentationId;
+    }
+
+    public void setProviderSegmentationId(Integer providerSegmentationId) {
+        this.providerSegmentationId = providerSegmentationId;
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see java.lang.Object#toString()
+     */
+    @Override
+    public String toString() {
+        return "Segment [ provider:physical_network=" + providerPhysicalNetwork +
+                ", provider:network_type=" + providerNetworkType +
+                ", provider:segmentation_id=" + providerSegmentationId + "]";
+    }
+}
diff --git a/quantum-model/src/main/java/com/woorea/openstack/quantum/model/Subnet.java b/quantum-model/src/main/java/com/woorea/openstack/quantum/model/Subnet.java
new file mode 100644 (file)
index 0000000..7301514
--- /dev/null
@@ -0,0 +1,264 @@
+package com.woorea.openstack.quantum.model;
+
+import java.io.Serializable;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonCreator;
+import org.codehaus.jackson.annotate.JsonIgnore;
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.annotate.JsonValue;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+@SuppressWarnings("serial")
+@JsonRootName("subnet")
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class Subnet implements Serializable {
+
+    private String name;
+
+    @JsonProperty("enable_dhcp")
+    private Boolean enableDHCP;
+
+    @JsonProperty("network_id")
+    private String networkId;
+
+    @JsonProperty("tenant_id")
+    private String tenantId;
+
+    @JsonProperty("dns_nameservers")
+    private List<String> dnsNames;
+
+    @JsonProperty("allocation_pools")
+    private List<Pool> list;
+
+    @JsonProperty("host_routes")
+    private List<String> hostRoutes;
+
+    @JsonProperty("ip_version")
+    private IpVersion ipversion;
+
+    @JsonProperty("gateway_ip")
+    private String gw;
+
+    private String cidr;
+
+    private String id;
+
+    public static enum IpVersion implements Serializable {
+        IPV4(4),
+        IPV6(6);
+        private int code;
+
+        IpVersion(int code) {
+            this.code = code;
+        }
+
+        @JsonValue
+        public int code() {
+            return code;
+        }
+
+        @JsonCreator
+        public static IpVersion valueOf(int value) {
+            for (IpVersion ipVersion : IpVersion.values()) {
+                if (ipVersion.code() == value) {
+                    return ipVersion;
+                }
+            }
+            return IPV4;
+        }
+
+        @Override
+        public String toString() {
+            return String.valueOf(code);
+        }
+    }
+
+    /**
+     * @return the name
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * @param name
+     *            the name to set
+     */
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    /**
+     * @return the enableDHCP
+     */
+    @JsonIgnore
+    public boolean isEnableDHCP() {
+        return enableDHCP;
+    }
+
+    public Boolean getEnableDHCP() {
+        return enableDHCP;
+    }
+
+    /**
+     * @param enableDHCP
+     *            the enableDHCP to set
+     */
+    public void setEnableDHCP(Boolean enableDHCP) {
+        this.enableDHCP = enableDHCP;
+    }
+
+    /**
+     * @return the networkId
+     */
+    public String getNetworkId() {
+        return networkId;
+    }
+
+    /**
+     * @param networkId
+     *            the networkId to set
+     */
+    public void setNetworkId(String networkId) {
+        this.networkId = networkId;
+    }
+
+    /**
+     * @return the tenantId
+     */
+    public String getTenantId() {
+        return tenantId;
+    }
+
+    /**
+     * @param tenantId
+     *            the tenantId to set
+     */
+    public void setTenantId(String tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    /**
+     * @return the dnsNames
+     */
+    public List<String> getDnsNames() {
+        return dnsNames;
+    }
+
+    /**
+     * @param dnsNames
+     *            the dnsNames to set
+     */
+    public void setDnsNames(List<String> dnsNames) {
+        this.dnsNames = dnsNames;
+    }
+
+    /**
+     * @return the list
+     */
+    public List<Pool> getList() {
+        return list;
+    }
+
+    /**
+     * @param list
+     *            the list to set
+     */
+    public void setList(List<Pool> list) {
+        this.list = list;
+    }
+
+    /**
+     * @return the hostRoutes
+     */
+    public List<String> getHostRoutes() {
+        return hostRoutes;
+    }
+
+    /**
+     * @param hostRoutes
+     *            the hostRoutes to set
+     */
+    public void setHostRoutes(List<String> hostRoutes) {
+        this.hostRoutes = hostRoutes;
+    }
+
+    /**
+     * @return the ipversion
+     */
+    public IpVersion getIpversion() {
+        return ipversion;
+    }
+
+    /**
+     * @param ipversion
+     *            the ipversion to set
+     */
+    public void setIpversion(IpVersion ipversion) {
+        this.ipversion = ipversion;
+    }
+
+    /**
+     * @return the gw
+     */
+    public String getGw() {
+        return gw;
+    }
+
+    /**
+     * @param gw
+     *            the gw to set
+     */
+    public void setGw(String gw) {
+        this.gw = gw;
+    }
+
+    /**
+     * @return the cidr
+     */
+    public String getCidr() {
+        return cidr;
+    }
+
+    /**
+     * @param cidr
+     *            the cidr to set
+     */
+    public void setCidr(String cidr) {
+        this.cidr = cidr;
+    }
+
+    /**
+     * @return the id
+     */
+    @JsonIgnore
+    public String getId() {
+        return id;
+    }
+
+    /**
+     * @param id
+     *            the id to set
+     */
+    @JsonProperty
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see java.lang.Object#toString()
+     */
+    @Override
+    public String toString() {
+        return "Subnet [id=" + id + ", name=" + name + ", network_id="
+                + networkId + ", tenant_id=" + tenantId + ", allocation_pools=" + list
+                + ", gateway_ip=" + gw + ", ip_version=" + ipversion
+                + ", cidr=" + cidr + ", enable_dhcp=" + enableDHCP + ", dns_nameservers="
+                + dnsNames + ", host_routes=" + hostRoutes + "]";
+    }
+
+}
diff --git a/quantum-model/src/main/java/com/woorea/openstack/quantum/model/SubnetForCreate.java b/quantum-model/src/main/java/com/woorea/openstack/quantum/model/SubnetForCreate.java
new file mode 100644 (file)
index 0000000..2c07ab2
--- /dev/null
@@ -0,0 +1,34 @@
+package com.woorea.openstack.quantum.model;
+
+import org.codehaus.jackson.annotate.JsonIgnore;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+
+/**
+ * Please use {@link Subnet} directly.
+ */
+@SuppressWarnings("serial")
+@JsonRootName("subnet")
+@Deprecated
+public class SubnetForCreate extends Subnet {
+
+    /**
+     * @return the ipVersion
+     * @deprecated
+     */
+    @Deprecated
+    @JsonIgnore
+    public int getIpVersion() {
+        return getIpversion().code();
+    }
+
+    /**
+     * @param ipVersion
+     *            the ipVersion to set
+     * @deprecated
+     */
+    @Deprecated
+    @JsonIgnore
+    public void setIpVersion(int ipVersion) {
+        setIpversion(IpVersion.valueOf(ipVersion));
+    }
+}
diff --git a/quantum-model/src/main/java/com/woorea/openstack/quantum/model/Subnets.java b/quantum-model/src/main/java/com/woorea/openstack/quantum/model/Subnets.java
new file mode 100644 (file)
index 0000000..e9b21f4
--- /dev/null
@@ -0,0 +1,36 @@
+package com.woorea.openstack.quantum.model;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class Subnets implements Serializable, Iterable<Subnet> {
+       
+       @JsonProperty("subnets")
+       private List<Subnet> list;
+       
+       /**
+        * @return the list
+        */
+       public List<Subnet> getList() {
+               return list;
+       }
+
+       /**
+        * @param list the list to set
+        */
+       public void setList(List<Subnet> list) {
+               this.list = list;
+       }
+
+       public String toString() {
+               return "Subnets [list=" + list + "]";
+       }
+       
+       public Iterator<Subnet> iterator() {
+               return list.iterator();
+       }
+
+}
diff --git a/quantum-model/src/test/java/com/woorea/openstack/quantum/model/NetworkTest.java b/quantum-model/src/test/java/com/woorea/openstack/quantum/model/NetworkTest.java
new file mode 100644 (file)
index 0000000..b6255b9
--- /dev/null
@@ -0,0 +1,119 @@
+package com.woorea.openstack.quantum.model;
+
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.hasItem;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.not;
+import static org.junit.Assert.assertThat;
+
+import java.util.Arrays;
+
+import org.codehaus.jackson.map.ObjectMapper;
+import org.junit.Before;
+import org.junit.Test;
+
+public class NetworkTest {
+
+    private static final String ID = "testId";
+
+    private static final boolean ADMIN_STATE_UP = true;
+
+    private static final String NAME = "name";
+
+    private static final String TENANT_ID = "tenantId";
+
+    private static final String SHARED = "shared";
+
+    private static final String STATUS = "status";
+
+    private static final String SUBNET = "subnet";
+
+    private static final String PROVIDER_NETWORK_TYPE = "vlan";
+
+    private static final String PROVIDER_PHYSICAL_NETWORK = "physicalNetwork";
+
+    private static final int PROVIDER_SEGMENTATION_ID = 100;
+
+    private static final String ROUTER_EXTERNAL = "routerExternal";
+
+    /**
+     * JSON with read only attributes.
+     */
+    private static final String NETWORK_JSON = "{"
+            + "  \"network\" : {"
+            + "    \"id\" : \"" + ID + "\","
+            + "    \"status\" : \"" + STATUS + "\","
+            + "    \"subnets\" : [ \"" + SUBNET + "\" ]"
+            + "  }"
+            + "}";
+
+    private ObjectMapper objectMapper;
+
+    private String serializedNetwork;
+
+    @Before
+    public void setUp() throws Exception {
+        objectMapper = PortTest.initializeObjectMapper();
+    }
+
+    @Test
+    public void testSerialization() throws Exception {
+        Network network = new Network();
+        network.setId(ID);
+        network.setProviderNetworkType(PROVIDER_NETWORK_TYPE);
+        network.setProviderPhysicalNetwork(PROVIDER_PHYSICAL_NETWORK);
+        network.setProviderSegmentationId(PROVIDER_SEGMENTATION_ID);
+        network.setAdminStateUp(ADMIN_STATE_UP);
+        network.setSubnets(Arrays.asList(SUBNET));
+        network.setRouterExternal(ROUTER_EXTERNAL);
+        network.setName(NAME);
+        network.setShared(SHARED);
+        network.setTenantId(TENANT_ID);
+
+        serializedNetwork = objectMapper.writeValueAsString(network);
+        assertThat(serializedNetwork, not(containsString(ID)));
+        assertThat(serializedNetwork, not(containsString(STATUS)));
+        assertThat(serializedNetwork, not(containsString(SUBNET)));
+        assertThat(serializedNetwork, containsString("\"admin_state_up\" : " + ADMIN_STATE_UP));
+        assertThat(serializedNetwork, containsString(NAME));
+        assertThat(serializedNetwork, containsString(SHARED));
+        assertThat(serializedNetwork, containsString(TENANT_ID));
+        assertThat(serializedNetwork, containsString(ROUTER_EXTERNAL));
+        assertThat(serializedNetwork, containsString(PROVIDER_NETWORK_TYPE));
+        assertThat(serializedNetwork, containsString(PROVIDER_PHYSICAL_NETWORK));
+        assertThat(serializedNetwork, containsString(Integer.toString(PROVIDER_SEGMENTATION_ID)));
+    }
+
+    @Test
+    public void testSerializationEmpty() throws Exception {
+        Network network = new Network();
+        serializedNetwork = objectMapper.writeValueAsString(network);
+
+        assertThat(serializedNetwork, containsString("\"network\" : { }"));
+    }
+
+    @Test
+    public void testDeserializationReadOnlyFields() throws Exception {
+        Network network = objectMapper.readValue(NETWORK_JSON, Network.class);
+
+        assertThat(network.getId(), is(equalTo(ID)));
+        assertThat(network.getSubnets(), hasItem(equalTo(SUBNET)));
+        assertThat(network.getStatus(), is(equalTo(STATUS)));
+    }
+
+    @Test
+    public void testDeserialization() throws Exception {
+        testSerialization();
+        Network network = objectMapper.readValue(serializedNetwork, Network.class);
+
+        assertThat(network.getName(), is(equalTo(NAME)));
+        assertThat(network.isAdminStateUp(), is(equalTo(ADMIN_STATE_UP)));
+        assertThat(network.getShared(), is(equalTo(SHARED)));
+        assertThat(network.getTenantId(), is(equalTo(TENANT_ID)));
+        assertThat(network.getRouterExternal(), is(equalTo(ROUTER_EXTERNAL)));
+        assertThat(network.getProviderNetworkType(), is(equalTo(PROVIDER_NETWORK_TYPE)));
+        assertThat(network.getProviderPhysicalNetwork(), is(equalTo(PROVIDER_PHYSICAL_NETWORK)));
+        assertThat(network.getProviderSegmentationId(), is(equalTo(PROVIDER_SEGMENTATION_ID)));
+    }
+}
diff --git a/quantum-model/src/test/java/com/woorea/openstack/quantum/model/PortTest.java b/quantum-model/src/test/java/com/woorea/openstack/quantum/model/PortTest.java
new file mode 100644 (file)
index 0000000..bce5044
--- /dev/null
@@ -0,0 +1,155 @@
+package com.woorea.openstack.quantum.model;
+
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.hasItem;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.not;
+import static org.junit.Assert.assertThat;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.codehaus.jackson.map.DeserializationConfig;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.map.SerializationConfig;
+import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
+import org.hamcrest.CustomMatcher;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.woorea.openstack.quantum.model.Port.Ip;
+
+public class PortTest {
+
+    private static final String TENANT_ID = "tenantId";
+
+    private static final String STATUS = "status";
+
+    private static final String NETWORK_ID = "networkId";
+
+    private static final String NAME = "name";
+
+    private static final String MAC_ADDRESS = "macAddress";
+
+    private static final String DEVICE_OWNER = "deviceOwner";
+
+    private static final String DEVICE_ID = "deviceId";
+
+    private static final String IP_SUBNET_ID = "ipSubnetId";
+
+    private static final String IP_ADDRESS = "10.0.0.1";
+
+    private static final boolean ADMIN_STATE_UP = true;
+
+    private static final String SEC_GROUP = "secGroup";
+
+    private static final String ID = "testId";
+
+    /**
+     * JSON with read only attributes.
+     */
+    private static final String PORT_JSON = "{"
+            + "  \"port\" : {"
+            + "    \"id\" : \"" + ID + "\","
+            + "    \"status\" : \"" + STATUS + "\""
+            + "  }"
+            + "}";
+
+    private ObjectMapper objectMapper;
+
+    private String serializedPort;
+
+    @Before
+    public void setUp() throws Exception {
+        objectMapper = initializeObjectMapper();
+    }
+
+    public static ObjectMapper initializeObjectMapper() {
+        ObjectMapper objectMapper = new ObjectMapper();
+        objectMapper.setSerializationInclusion(Inclusion.NON_NULL)
+                .enable(SerializationConfig.Feature.INDENT_OUTPUT)
+                .enable(SerializationConfig.Feature.WRAP_ROOT_VALUE)
+                .enable(DeserializationConfig.Feature.UNWRAP_ROOT_VALUE)
+                .enable(DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
+        return objectMapper;
+    }
+
+    @Test
+    public void testSerialization() throws Exception {
+        Port port = new Port();
+        port.setId(ID);
+        port.setAdminStateUp(ADMIN_STATE_UP);
+        port.setSecurityGroups(Arrays.asList(SEC_GROUP));
+        port.setDeviceId(DEVICE_ID);
+        port.setDeviceOwner(DEVICE_OWNER);
+        port.setMacAddress(MAC_ADDRESS);
+        port.setName(NAME);
+        port.setNetworkId(NETWORK_ID);
+        port.setStatus(STATUS);
+        port.setTenantId(TENANT_ID);
+
+        List<Ip> ips = new ArrayList<Port.Ip>();
+        Ip ip = new Ip();
+        ip.setAddress(IP_ADDRESS);
+        ip.setSubnetId(IP_SUBNET_ID);
+        ips.add(ip);
+        port.setList(ips);
+
+        serializedPort = objectMapper.writeValueAsString(port);
+        assertThat(serializedPort, not(containsString(ID)));
+        assertThat(serializedPort, not(containsString(STATUS)));
+        assertThat(serializedPort, containsString("\"admin_state_up\" : " + ADMIN_STATE_UP));
+        assertThat(serializedPort, containsString(SEC_GROUP));
+        assertThat(serializedPort, containsString(IP_ADDRESS));
+        assertThat(serializedPort, containsString(DEVICE_ID));
+        assertThat(serializedPort, containsString(DEVICE_OWNER));
+        assertThat(serializedPort, containsString(MAC_ADDRESS));
+        assertThat(serializedPort, containsString(NAME));
+        assertThat(serializedPort, containsString(NETWORK_ID));
+        assertThat(serializedPort, containsString(TENANT_ID));
+    }
+
+    @Test
+    public void testSerializationEmpty() throws Exception {
+        Port port = new Port();
+        serializedPort = objectMapper.writeValueAsString(port);
+
+        assertThat(serializedPort, containsString("\"port\" : { }"));
+    }
+
+    @Test
+    public void testDeserializationReadOnlyFields() throws Exception {
+        Port port = objectMapper.readValue(PORT_JSON, Port.class);
+
+        assertThat(port.getId(), is(equalTo(ID)));
+        assertThat(port.getStatus(), is(equalTo(STATUS)));
+    }
+
+    @Test
+    public void testDeserializationAfterSerialization() throws Exception {
+        testSerialization();
+        Port port = objectMapper.readValue(serializedPort, Port.class);
+
+        assertThat(port.getAdminStateUp(), is(equalTo(ADMIN_STATE_UP)));
+        assertThat(port.getDeviceId(), is(equalTo(DEVICE_ID)));
+        assertThat(port.getDeviceOwner(), is(equalTo(DEVICE_OWNER)));
+        assertThat(port.getMacAddress(), is(equalTo(MAC_ADDRESS)));
+        assertThat(port.getName(), is(equalTo(NAME)));
+        assertThat(port.getNetworkId(), is(equalTo(NETWORK_ID)));
+        assertThat(port.getTenantId(), is(equalTo(TENANT_ID)));
+
+        assertThat(port.getSecurityGroups(), hasItem(equalTo(SEC_GROUP)));
+        assertThat(port.getList(), hasItem(new CustomMatcher<Ip>(
+                "an Ip object with address " + IP_ADDRESS + " and subnet id " + IP_SUBNET_ID) {
+
+            @Override
+            public boolean matches(Object ip) {
+                return ip instanceof Ip
+                        && IP_ADDRESS.equals(((Ip) ip).getAddress())
+                        && IP_SUBNET_ID.equals(((Ip) ip).getSubnetId());
+            }
+        }));
+    }
+}
diff --git a/quantum-model/src/test/java/com/woorea/openstack/quantum/model/SubnetTest.java b/quantum-model/src/test/java/com/woorea/openstack/quantum/model/SubnetTest.java
new file mode 100644 (file)
index 0000000..9136a38
--- /dev/null
@@ -0,0 +1,137 @@
+package com.woorea.openstack.quantum.model;
+
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.hasItem;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.not;
+import static org.junit.Assert.assertThat;
+
+import java.util.Arrays;
+
+import org.codehaus.jackson.map.ObjectMapper;
+import org.hamcrest.CustomMatcher;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.woorea.openstack.quantum.model.Subnet.IpVersion;
+
+public class SubnetTest {
+
+    private static final String POOL_END = "poolEnd";
+
+    private static final String POOL_START = "poolStart";
+
+    private static final String TENANT_ID = "tenantId";
+
+    private static final String NETWORK_ID = "networkId";
+
+    private static final String NAME = "name";
+
+    private static final String HOST_ROUTE = "hostRoute";
+
+    private static final String GATEWAY = "gw";
+
+    private static final boolean ENABLE_DHCP = true;
+
+    private static final String ID = "testId";
+
+    private static final String CIDR = "10.0.0.0/8";
+
+    private static final String DNS_SERVER = "dnsServer";
+
+    private static final IpVersion IP_VERSION = IpVersion.IPV4;
+
+    /**
+     * JSON with read only attributes.
+     */
+    private static final String SUBNET_JSON = "{"
+            + "  \"subnet\" : {"
+            + "    \"id\" : \"" + ID + "\""
+            + "  }"
+            + "}";
+
+    private ObjectMapper objectMapper;
+
+    private String serializedSubnet;
+
+    @Before
+    public void setUp() throws Exception {
+        objectMapper = PortTest.initializeObjectMapper();
+    }
+
+    @Test
+    public void testSerialization() throws Exception {
+        Subnet subnet = new Subnet();
+        subnet.setId(ID);
+        subnet.setCidr(CIDR);
+        subnet.setDnsNames(Arrays.asList(DNS_SERVER));
+        subnet.setEnableDHCP(ENABLE_DHCP);
+        subnet.setIpversion(IP_VERSION);
+        subnet.setGw(GATEWAY);
+        subnet.setHostRoutes(Arrays.asList(HOST_ROUTE));
+        subnet.setName(NAME);
+        subnet.setNetworkId(NETWORK_ID);
+        subnet.setTenantId(TENANT_ID);
+
+        Pool pool = new Pool();
+        pool.setStart(POOL_START);
+        pool.setEnd(POOL_END);
+        subnet.setList(Arrays.asList(pool));
+
+        serializedSubnet = objectMapper.writeValueAsString(subnet);
+        assertThat(serializedSubnet, not(containsString(ID)));
+        assertThat(serializedSubnet, containsString(CIDR));
+        assertThat(serializedSubnet, containsString(DNS_SERVER));
+        assertThat(serializedSubnet, containsString("\"enable_dhcp\" : " + ENABLE_DHCP));
+        assertThat(serializedSubnet, containsString(Integer.toString(IP_VERSION.code())));
+        assertThat(serializedSubnet, containsString(GATEWAY));
+        assertThat(serializedSubnet, containsString(HOST_ROUTE));
+        assertThat(serializedSubnet, containsString(NAME));
+        assertThat(serializedSubnet, containsString(NETWORK_ID));
+        assertThat(serializedSubnet, containsString(TENANT_ID));
+        assertThat(serializedSubnet, containsString(POOL_START));
+        assertThat(serializedSubnet, containsString(POOL_END));
+    }
+
+    @Test
+    public void testSerializationEmpty() throws Exception {
+        Subnet subnet = new Subnet();
+        serializedSubnet = objectMapper.writeValueAsString(subnet);
+
+        assertThat(serializedSubnet, containsString("\"subnet\" : { }"));
+    }
+
+    @Test
+    public void testDeserializationReadOnlyFields() throws Exception {
+        Subnet subnet = objectMapper.readValue(SUBNET_JSON, Subnet.class);
+
+        assertThat(subnet.getId(), is(equalTo(ID)));
+    }
+
+    @Test
+    public void testDeserializationAfterSerialization() throws Exception {
+        testSerialization();
+        Subnet subnet = objectMapper.readValue(serializedSubnet, Subnet.class);
+
+        assertThat(subnet.getCidr(), is(equalTo(CIDR)));
+        assertThat(subnet.getDnsNames(), hasItem(equalTo(DNS_SERVER)));
+        assertThat(subnet.isEnableDHCP(), is(equalTo(ENABLE_DHCP)));
+        assertThat(subnet.getIpversion(), is(equalTo(IP_VERSION)));
+        assertThat(subnet.getGw(), is(equalTo(GATEWAY)));
+        assertThat(subnet.getHostRoutes(), hasItem(equalTo(HOST_ROUTE)));
+        assertThat(subnet.getName(), is(equalTo(NAME)));
+        assertThat(subnet.getNetworkId(), is(equalTo(NETWORK_ID)));
+        assertThat(subnet.getTenantId(), is(equalTo(TENANT_ID)));
+        assertThat(subnet.getList(), hasItem(new CustomMatcher<Pool>(
+                "a Pool object with start " + POOL_START + " and end " + POOL_END) {
+
+            @Override
+            public boolean matches(Object pool) {
+                return pool instanceof Pool
+                        && POOL_START.equals(((Pool) pool).getStart())
+                        && POOL_END.equals(((Pool) pool).getEnd());
+            }
+        }));
+    }
+}
diff --git a/swift-client/pom.xml b/swift-client/pom.xml
new file mode 100644 (file)
index 0000000..b36f117
--- /dev/null
@@ -0,0 +1,24 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+       <modelVersion>4.0.0</modelVersion>
+       <parent>
+               <groupId>org.openecomp.mso.libs</groupId>
+               <artifactId>openstack-java-sdk</artifactId>
+               <version>1.0.0-SNAPSHOT</version>
+       </parent>
+       <groupId>org.openecomp.mso.libs.openstack-java-sdk</groupId>
+       <artifactId>swift-client</artifactId>
+       <name>OpenStack Swift Client</name>
+       <description>OpenStack Swift Client</description>
+       <dependencies>
+               <dependency>
+                       <groupId>org.openecomp.mso.libs.openstack-java-sdk</groupId>
+                       <artifactId>openstack-client</artifactId>
+                       <version>1.0.0-SNAPSHOT</version>
+               </dependency>
+               <dependency>
+                       <groupId>org.openecomp.mso.libs.openstack-java-sdk</groupId>
+                       <artifactId>swift-model</artifactId>
+                       <version>1.0.0-SNAPSHOT</version>
+               </dependency>
+       </dependencies>
+</project>
\ No newline at end of file
diff --git a/swift-client/src/main/java/com/woorea/openstack/swift/Swift.java b/swift-client/src/main/java/com/woorea/openstack/swift/Swift.java
new file mode 100644 (file)
index 0000000..0629853
--- /dev/null
@@ -0,0 +1,33 @@
+package com.woorea.openstack.swift;
+
+
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackClientConnector;
+import com.woorea.openstack.swift.api.AccountResource;
+import com.woorea.openstack.swift.api.ContainersResource;
+
+public class Swift extends OpenStackClient {
+       
+       private final AccountResource ACCOUNT;
+       
+       private final ContainersResource CONTAINERS;
+       
+       public Swift(String endpoint, OpenStackClientConnector connector) {
+               super(endpoint, connector);
+               CONTAINERS = new ContainersResource(this);
+               ACCOUNT = new AccountResource(this);
+       }
+       
+       public Swift(String endpoint) {
+               this(endpoint, null);
+       }
+       
+       public ContainersResource containers() {
+               return CONTAINERS;
+       }
+       
+       public AccountResource account() {
+               return ACCOUNT;
+       }
+
+}
diff --git a/swift-client/src/main/java/com/woorea/openstack/swift/api/AccountResource.java b/swift-client/src/main/java/com/woorea/openstack/swift/api/AccountResource.java
new file mode 100644 (file)
index 0000000..f98fbf9
--- /dev/null
@@ -0,0 +1,22 @@
+package com.woorea.openstack.swift.api;
+
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+
+public class AccountResource {
+       
+       private final OpenStackClient CLIENT;
+       
+       public AccountResource(OpenStackClient client) {
+               CLIENT = client;
+       }
+
+       public class ShowAccount extends OpenStackRequest<Void> {
+
+               public ShowAccount() {
+//                     return target.request(MediaType.APPLICATION_JSON).head();
+               }
+
+       }
+
+}
diff --git a/swift-client/src/main/java/com/woorea/openstack/swift/api/ContainerResource.java b/swift-client/src/main/java/com/woorea/openstack/swift/api/ContainerResource.java
new file mode 100644 (file)
index 0000000..c55babe
--- /dev/null
@@ -0,0 +1,143 @@
+package com.woorea.openstack.swift.api;
+
+import java.util.Map;
+
+
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.base.client.OpenStackResponse;
+import com.woorea.openstack.swift.model.ObjectDownload;
+import com.woorea.openstack.swift.model.ObjectForUpload;
+
+public class ContainerResource {
+       
+       private final OpenStackClient CLIENT;
+       
+       private String container;
+       
+       public ContainerResource(OpenStackClient client, String container) {
+               CLIENT = client;
+               this.container = container;
+       }
+       
+       public List list() {
+               return new List(container, null);
+       }
+       
+       public CreateDirectory createDirectory(String path) {
+               return new CreateDirectory(container, path);
+       }
+       
+       public Show show(String path) {
+               return new Show(container, path);
+       }
+       
+       public Upload upload(ObjectForUpload objectForUpload) {
+               return new Upload(objectForUpload);
+       }
+       
+       public Download download(String path) {
+               return new Download(container, path);
+       }
+       
+       public Delete delete(String path) {
+               return new Delete(container, path);
+       }
+       
+       public class List extends OpenStackRequest<java.util.List<Object>> {
+
+               private String containerName;
+               
+               private Map<String, String> filters;
+               
+               public List(String containerName, Map<String, String> filters) {
+                       this.containerName = containerName;
+                       this.filters = filters;
+                       //returnType(new TypeToken<List<Object>>(){});
+//                     target = target.path(containerName);
+//                     for(String filter : new String[]{"prefix","delimiter","path","marker"}) {
+//                             if(filters.get(filter) != null) {
+//                                     target = target.queryParam(filter, filters.get(filter));
+//                             }
+//                     }
+//                     return target.request(MediaType.APPLICATION_JSON).get(new GenericType<List<Object>>(){});
+               }
+               
+       }
+
+       public class CreateDirectory extends OpenStackRequest<Void> {
+
+               private String container;
+               
+               private String path;
+               
+               public CreateDirectory(String container, String path) {
+                       this.container = container;
+                       this.path = path;
+//                     endpoint.path(container).path(path).request().put(Entity.entity(new byte[1],"application/directory"));
+               }
+               
+       }
+       
+       public class Show extends OpenStackRequest<Object> {
+
+               private String containerName;
+               
+               private String objectName;
+               
+               public Show(String containerName, String objectName) {
+                       this.containerName = containerName;
+                       this.objectName = objectName;
+//                     return target.path(containerName).path(objectName).request(MediaType.APPLICATION_JSON).head();
+               }
+
+       }
+       
+       public class Upload extends OpenStackRequest<OpenStackResponse> {
+
+               private ObjectForUpload objectForUpload;
+               
+               public Upload(ObjectForUpload objectForUpload) {
+                       this.objectForUpload = objectForUpload;
+//                     Invocation.Builder invocationBuilder = target.path(objectForUpload.getContainer()).path(objectForUpload.getName()).request(MediaType.APPLICATION_JSON);
+//                     for(String key : objectForUpload.getProperties().keySet()) {
+//                             invocationBuilder.header("x-object-meta-" + key, objectForUpload.getProperties().get(key));
+//                     }
+//                     return invocationBuilder.put(Entity.entity(objectForUpload.getInputStream(), MediaType.APPLICATION_OCTET_STREAM), Response.class);
+               }
+
+       }
+       
+       public class Download extends OpenStackRequest<ObjectDownload> {
+
+               private String containerName;
+               
+               private String objectName;
+               
+               public Download(String containerName, String objectName) {
+                       this.containerName = containerName;
+                       this.objectName = objectName;
+//                     Response response = target.path(containerName).path(objectName).request(MediaType.APPLICATION_JSON).get();
+//                     ObjectDownload objectDownload = new ObjectDownload();
+//                     objectDownload.setInputStream((InputStream) response.getEntity());
+//                     return objectDownload;
+               }
+
+       }
+
+       
+       public class Delete extends OpenStackRequest<Void> {
+
+               private String containerName;
+               
+               private String objectName;
+               
+               public Delete(String containerName, String objectName) {
+                       this.containerName = containerName;
+                       this.objectName = objectName;
+                       //return target.path(containerName).path(objectName).request(MediaType.APPLICATION_JSON).delete();
+               }
+
+       }
+
+}
diff --git a/swift-client/src/main/java/com/woorea/openstack/swift/api/ContainersResource.java b/swift-client/src/main/java/com/woorea/openstack/swift/api/ContainersResource.java
new file mode 100644 (file)
index 0000000..aedcc3f
--- /dev/null
@@ -0,0 +1,74 @@
+package com.woorea.openstack.swift.api;
+
+
+import com.woorea.openstack.base.client.OpenStackClient;
+import com.woorea.openstack.base.client.OpenStackRequest;
+import com.woorea.openstack.swift.model.Container;
+
+public class ContainersResource {
+       
+       private final OpenStackClient CLIENT;
+       
+       public ContainersResource(OpenStackClient client) {
+               CLIENT = client;
+       }
+       
+       public List list() {
+               return new List();
+       }
+       
+       public Create create(String name) {
+               return new Create(name);
+       }
+       
+       public Show show(String name) {
+               return new Show(name);
+       }
+       
+       public Delete delete(String name) {
+               return new Delete(name);
+       }
+       
+       public ContainerResource container(String name) {
+               return new ContainerResource(CLIENT, name);
+       }
+       
+       public class List extends OpenStackRequest<java.util.List<Container>> {
+
+               public List() {
+                       //return target.request(MediaType.APPLICATION_JSON).get(new GenericType<List<Container>>(){});
+               }
+
+       }
+
+
+       public class Create extends OpenStackRequest<Container> {
+               
+               public Create(String containerName) {
+                       //return target.path(containerName).request().method("PUT",Entity.text("*"));
+               }
+
+       }
+       
+       public class Show extends OpenStackRequest<Container> {
+
+               private String containerName;
+               
+               public Show(String containerName) {
+//                     return target.path(containerName).request(MediaType.APPLICATION_JSON).head();
+               }
+
+       }
+       
+       public class Delete extends OpenStackRequest<Void> {
+
+               private String containerName;
+               
+               public Delete(String containerName) {
+                       this.containerName = containerName;
+                       //return target.path(containerName).request(MediaType.APPLICATION_JSON).delete();
+               }
+
+       }
+       
+}
diff --git a/swift-model/pom.xml b/swift-model/pom.xml
new file mode 100644 (file)
index 0000000..4d8acb8
--- /dev/null
@@ -0,0 +1,12 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+       <modelVersion>4.0.0</modelVersion>
+       <parent>
+               <groupId>org.openecomp.mso.libs</groupId>
+               <artifactId>openstack-java-sdk</artifactId>
+               <version>1.0.0-SNAPSHOT</version>
+       </parent>
+       <groupId>org.openecomp.mso.libs.openstack-java-sdk</groupId>
+       <artifactId>swift-model</artifactId>
+       <name>OpenStack Swift Model</name>
+       <description>OpenStack Swift Model</description>
+</project>
\ No newline at end of file
diff --git a/swift-model/src/main/java/com/woorea/openstack/swift/model/Account.java b/swift-model/src/main/java/com/woorea/openstack/swift/model/Account.java
new file mode 100644 (file)
index 0000000..8b32ffa
--- /dev/null
@@ -0,0 +1,64 @@
+package com.woorea.openstack.swift.model;
+
+import java.io.Serializable;
+
+public class Account implements Serializable {
+
+       private Integer containerCount;
+       
+       private Integer objectCount;
+       
+       private Integer bytesUsed;
+
+       /**
+        * @return the containerCount
+        */
+       public Integer getContainerCount() {
+               return containerCount;
+       }
+
+       /**
+        * @param containerCount the containerCount to set
+        */
+       public void setContainerCount(Integer containerCount) {
+               this.containerCount = containerCount;
+       }
+
+       /**
+        * @return the objectCount
+        */
+       public Integer getObjectCount() {
+               return objectCount;
+       }
+
+       /**
+        * @param objectCount the objectCount to set
+        */
+       public void setObjectCount(Integer objectCount) {
+               this.objectCount = objectCount;
+       }
+
+       /**
+        * @return the bytesUsed
+        */
+       public Integer getBytesUsed() {
+               return bytesUsed;
+       }
+
+       /**
+        * @param bytesUsed the bytesUsed to set
+        */
+       public void setBytesUsed(Integer bytesUsed) {
+               this.bytesUsed = bytesUsed;
+       }
+
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Account [containerCount=" + containerCount + ", objectCount="
+                               + objectCount + ", bytesUsed=" + bytesUsed + "]";
+       }
+       
+}
diff --git a/swift-model/src/main/java/com/woorea/openstack/swift/model/Container.java b/swift-model/src/main/java/com/woorea/openstack/swift/model/Container.java
new file mode 100644 (file)
index 0000000..62a002a
--- /dev/null
@@ -0,0 +1,70 @@
+package com.woorea.openstack.swift.model;
+
+import java.io.Serializable;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class Container implements Serializable {
+       
+       private String name;
+       
+       @JsonProperty("count")
+       private Integer objectCount;
+       
+       @JsonProperty("bytes")
+       private Long bytesUsed;
+
+       /**
+        * @return the name
+        */
+       public String getName() {
+               return name;
+       }
+
+       /**
+        * @param name the name to set
+        */
+       public void setName(String name) {
+               this.name = name;
+       }
+
+       /**
+        * @return the objectCount
+        */
+       public Integer getObjectCount() {
+               return objectCount;
+       }
+
+       /**
+        * @param objectCount the objectCount to set
+        */
+       public void setObjectCount(Integer objectCount) {
+               this.objectCount = objectCount;
+       }
+
+       /**
+        * @return the bytesUsed
+        */
+       public Long getBytesUsed() {
+               return bytesUsed;
+       }
+
+       /**
+        * @param bytesUsed the bytesUsed to set
+        */
+       public void setBytesUsed(Long bytesUsed) {
+               this.bytesUsed = bytesUsed;
+       }
+
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       @Override
+       public String toString() {
+               return "Container [name=" + name + ", objectCount=" + objectCount
+                               + ", bytesUsed=" + bytesUsed + "]";
+       }
+
+       
+       
+}
diff --git a/swift-model/src/main/java/com/woorea/openstack/swift/model/Object.java b/swift-model/src/main/java/com/woorea/openstack/swift/model/Object.java
new file mode 100644 (file)
index 0000000..d53ee65
--- /dev/null
@@ -0,0 +1,109 @@
+package com.woorea.openstack.swift.model;
+
+import java.io.Serializable;
+import java.util.Calendar;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+
+public class Object implements Serializable {
+       
+       private String subdir;
+       
+       private String name;
+       
+       private String hash;
+       
+       private int bytes;
+       
+       @JsonProperty("content_type")
+       private String contentType;
+       
+       @JsonProperty("last_modified")
+       private Calendar lastModified;
+
+       /**
+        * @return the subdir
+        */
+       public String getSubdir() {
+               return subdir;
+       }
+
+       /**
+        * @param subdir the subdir to set
+        */
+       public void setSubdir(String subdir) {
+               this.subdir = subdir;
+       }
+
+       /**
+        * @return the name
+        */
+       public String getName() {
+               return name;
+       }
+
+       /**
+        * @param name the name to set
+        */
+       public void setName(String name) {
+               this.name = name;
+       }
+
+       /**
+        * @return the hash
+        */
+       public String getHash() {
+               return hash;
+       }
+
+       /**
+        * @param hash the hash to set
+        */
+       public void setHash(String hash) {
+               this.hash = hash;
+       }
+
+       /**
+        * @return the bytes
+        */
+       public int getBytes() {
+               return bytes;
+       }
+
+       /**
+        * @param bytes the bytes to set
+        */
+       public void setBytes(int bytes) {
+               this.bytes = bytes;
+       }
+
+       /**
+        * @return the contentType
+        */
+       public String getContentType() {
+               return contentType;
+       }
+
+       /**
+        * @param contentType the contentType to set
+        */
+       public void setContentType(String contentType) {
+               this.contentType = contentType;
+       }
+
+       /**
+        * @return the lastModified
+        */
+       public Calendar getLastModified() {
+               return lastModified;
+       }
+
+       /**
+        * @param lastModified the lastModified to set
+        */
+       public void setLastModified(Calendar lastModified) {
+               this.lastModified = lastModified;
+       }
+       
+}
diff --git a/swift-model/src/main/java/com/woorea/openstack/swift/model/ObjectDownload.java b/swift-model/src/main/java/com/woorea/openstack/swift/model/ObjectDownload.java
new file mode 100644 (file)
index 0000000..00f0ff8
--- /dev/null
@@ -0,0 +1,41 @@
+package com.woorea.openstack.swift.model;
+
+import java.io.InputStream;
+
+
+
+public class ObjectDownload {
+
+       private Object object;
+       
+       private InputStream inputStream;
+
+       /**
+        * @return the object
+        */
+       public Object getObject() {
+               return object;
+       }
+
+       /**
+        * @param object the object to set
+        */
+       public void setObject(Object object) {
+               this.object = object;
+       }
+
+       /**
+        * @return the inputStream
+        */
+       public InputStream getInputStream() {
+               return inputStream;
+       }
+
+       /**
+        * @param inputStream the inputStream to set
+        */
+       public void setInputStream(InputStream inputStream) {
+               this.inputStream = inputStream;
+       }
+
+}
diff --git a/swift-model/src/main/java/com/woorea/openstack/swift/model/ObjectForUpload.java b/swift-model/src/main/java/com/woorea/openstack/swift/model/ObjectForUpload.java
new file mode 100644 (file)
index 0000000..fd560b6
--- /dev/null
@@ -0,0 +1,72 @@
+package com.woorea.openstack.swift.model;
+
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+
+public class ObjectForUpload {
+       
+       private String container;
+       
+       private String name;
+       
+       private Map<String, java.lang.Object> properties;
+
+       private InputStream inputStream;
+
+       /**
+        * @return the container
+        */
+       public String getContainer() {
+               return container;
+       }
+
+       /**
+        * @param container the container to set
+        */
+       public void setContainer(String container) {
+               this.container = container;
+       }
+
+       /**
+        * @return the name
+        */
+       public String getName() {
+               return name;
+       }
+
+       /**
+        * @param name the name to set
+        */
+       public void setName(String name) {
+               this.name = name;
+       }
+
+       /**
+        * @return the properties
+        */
+       public Map<String, java.lang.Object> getProperties() {
+               if(properties == null) {
+                       properties = new HashMap<String, java.lang.Object>();
+               }
+               return properties;
+       }
+
+       /**
+        * @return the inputStream
+        */
+       public InputStream getInputStream() {
+               return inputStream;
+       }
+
+       /**
+        * @param inputStream the inputStream to set
+        */
+       public void setInputStream(InputStream inputStream) {
+               this.inputStream = inputStream;
+       }
+
+       
+
+}
diff --git a/version.properties b/version.properties
new file mode 100644 (file)
index 0000000..f44df45
--- /dev/null
@@ -0,0 +1,14 @@
+###########################################################
+# Versioning variables
+# Note that these variables cannot be structured (e.g. : version.release or version.snapshot etc... )
+# because they are used in Jenkins, whose plug-in doesn't support
+major_version=1
+minor_version=0
+sprint_number=0
+
+base_version=${major_version}.${minor_version}.${sprint_number}
+
+# Release must be completed with GIT information # in Jenkins
+release_version=${base_version}
+snapshot_version=${base_version}-SNAPSHOT