summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore8
-rw-r--r--.gitreview4
-rw-r--r--LICENSE.txt202
-rw-r--r--README.textile142
-rw-r--r--bundle.sh2
-rw-r--r--ceilometer-client/pom.xml24
-rw-r--r--ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/Ceilometer.java34
-rw-r--r--ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/QueriableCeilometerCommand.java58
-rw-r--r--ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/v2/api/MetersResource.java71
-rw-r--r--ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/v2/api/ResourcesResource.java45
-rw-r--r--ceilometer-model/pom.xml12
-rw-r--r--ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Meter.java54
-rw-r--r--ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Resource.java50
-rw-r--r--ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Sample.java94
-rw-r--r--ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Statistics.java88
-rw-r--r--glance-client/pom.xml25
-rw-r--r--glance-client/src/main/java/com/woorea/openstack/glance/Glance.java30
-rw-r--r--glance-client/src/main/java/com/woorea/openstack/glance/ImagesResource.java280
-rw-r--r--glance-client/src/main/java/com/woorea/openstack/glance/SharedImagesResource.java30
-rw-r--r--glance-model/pom.xml12
-rw-r--r--glance-model/src/main/java/com/woorea/openstack/glance/model/Image.java343
-rw-r--r--glance-model/src/main/java/com/woorea/openstack/glance/model/ImageDownload.java39
-rw-r--r--glance-model/src/main/java/com/woorea/openstack/glance/model/ImageMember.java52
-rw-r--r--glance-model/src/main/java/com/woorea/openstack/glance/model/ImageMembers.java26
-rw-r--r--glance-model/src/main/java/com/woorea/openstack/glance/model/ImageUpload.java67
-rw-r--r--glance-model/src/main/java/com/woorea/openstack/glance/model/Images.java26
-rw-r--r--glance-model/src/main/java/com/woorea/openstack/glance/model/SharedImage.java5
-rw-r--r--glance-model/src/main/java/com/woorea/openstack/glance/model/SharedImages.java26
-rw-r--r--heat-client/pom.xml26
-rw-r--r--heat-client/src/main/java/com/woorea/openstack/heat/Heat.java31
-rw-r--r--heat-client/src/main/java/com/woorea/openstack/heat/ResourcesResource.java31
-rw-r--r--heat-client/src/main/java/com/woorea/openstack/heat/StackResource.java76
-rw-r--r--heat-model/pom.xml12
-rw-r--r--heat-model/src/main/java/com/woorea/openstack/heat/model/CreateStackParam.java127
-rw-r--r--heat-model/src/main/java/com/woorea/openstack/heat/model/Explanation.java77
-rw-r--r--heat-model/src/main/java/com/woorea/openstack/heat/model/Link.java35
-rw-r--r--heat-model/src/main/java/com/woorea/openstack/heat/model/Resource.java122
-rw-r--r--heat-model/src/main/java/com/woorea/openstack/heat/model/Resources.java28
-rw-r--r--heat-model/src/main/java/com/woorea/openstack/heat/model/Stack.java243
-rw-r--r--heat-model/src/main/java/com/woorea/openstack/heat/model/Stacks.java17
-rw-r--r--heat-model/src/main/java/com/woorea/openstack/heat/model/UpdateStackParam.java134
-rw-r--r--keystone-client/pom.xml25
-rw-r--r--keystone-client/src/main/java/com/woorea/openstack/keystone/Keystone.java65
-rw-r--r--keystone-client/src/main/java/com/woorea/openstack/keystone/api/EndpointsResource.java71
-rw-r--r--keystone-client/src/main/java/com/woorea/openstack/keystone/api/RolesResource.java58
-rw-r--r--keystone-client/src/main/java/com/woorea/openstack/keystone/api/ServicesResource.java70
-rw-r--r--keystone-client/src/main/java/com/woorea/openstack/keystone/api/TenantsResource.java212
-rw-r--r--keystone-client/src/main/java/com/woorea/openstack/keystone/api/TokensResource.java83
-rw-r--r--keystone-client/src/main/java/com/woorea/openstack/keystone/api/UsersResource.java85
-rw-r--r--keystone-client/src/main/java/com/woorea/openstack/keystone/utils/KeystoneTokenProvider.java56
-rw-r--r--keystone-client/src/main/java/com/woorea/openstack/keystone/utils/KeystoneUtils.java28
-rw-r--r--keystone-client/src/main/java/com/woorea/openstack/keystone/v3/Keystone.java73
-rw-r--r--keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/CredentialsResources.java13
-rw-r--r--keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/DomainGroupRolesResource.java13
-rw-r--r--keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/DomainUserRolesResource.java24
-rw-r--r--keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/DomainsResource.java21
-rw-r--r--keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/EndpointsResource.java13
-rw-r--r--keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/GenericResource.java44
-rw-r--r--keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/GroupUsersResource.java14
-rw-r--r--keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/GroupsResource.java17
-rw-r--r--keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/PoliciesResource.java15
-rw-r--r--keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/ProjectGroupRolesResource.java34
-rw-r--r--keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/ProjectRolesResource.java27
-rw-r--r--keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/ProjectUserRolesResource.java24
-rw-r--r--keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/ProjectsResource.java27
-rw-r--r--keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/RolesResource.java19
-rw-r--r--keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/ServicesResource.java13
-rw-r--r--keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/TokensResource.java42
-rw-r--r--keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/UsersResource.java27
-rw-r--r--keystone-model/pom.xml13
-rw-r--r--keystone-model/src/main/java/com/woorea/openstack/keystone/model/Access.java252
-rw-r--r--keystone-model/src/main/java/com/woorea/openstack/keystone/model/Authentication.java41
-rw-r--r--keystone-model/src/main/java/com/woorea/openstack/keystone/model/Endpoint.java121
-rw-r--r--keystone-model/src/main/java/com/woorea/openstack/keystone/model/Endpoints.java34
-rw-r--r--keystone-model/src/main/java/com/woorea/openstack/keystone/model/Error.java46
-rw-r--r--keystone-model/src/main/java/com/woorea/openstack/keystone/model/Link.java42
-rw-r--r--keystone-model/src/main/java/com/woorea/openstack/keystone/model/Metadata.java54
-rw-r--r--keystone-model/src/main/java/com/woorea/openstack/keystone/model/Role.java67
-rw-r--r--keystone-model/src/main/java/com/woorea/openstack/keystone/model/Roles.java34
-rw-r--r--keystone-model/src/main/java/com/woorea/openstack/keystone/model/Service.java76
-rw-r--r--keystone-model/src/main/java/com/woorea/openstack/keystone/model/Services.java34
-rw-r--r--keystone-model/src/main/java/com/woorea/openstack/keystone/model/Tenant.java102
-rw-r--r--keystone-model/src/main/java/com/woorea/openstack/keystone/model/Tenants.java44
-rw-r--r--keystone-model/src/main/java/com/woorea/openstack/keystone/model/Token.java52
-rw-r--r--keystone-model/src/main/java/com/woorea/openstack/keystone/model/User.java139
-rw-r--r--keystone-model/src/main/java/com/woorea/openstack/keystone/model/Users.java34
-rw-r--r--keystone-model/src/main/java/com/woorea/openstack/keystone/model/authentication/AccessKey.java72
-rw-r--r--keystone-model/src/main/java/com/woorea/openstack/keystone/model/authentication/RackspaceAuthentication.java99
-rw-r--r--keystone-model/src/main/java/com/woorea/openstack/keystone/model/authentication/TokenAuthentication.java50
-rw-r--r--keystone-model/src/main/java/com/woorea/openstack/keystone/model/authentication/UsernamePassword.java71
-rw-r--r--keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Authentication.java284
-rw-r--r--keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Credential.java61
-rw-r--r--keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Credentials.java34
-rw-r--r--keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Domain.java48
-rw-r--r--keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Domains.java34
-rw-r--r--keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Endpoint.java51
-rw-r--r--keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Endpoints.java34
-rw-r--r--keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Group.java50
-rw-r--r--keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Groups.java34
-rw-r--r--keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Policies.java34
-rw-r--r--keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Policy.java61
-rw-r--r--keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Project.java50
-rw-r--r--keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Projects.java34
-rw-r--r--keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Role.java67
-rw-r--r--keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Roles.java34
-rw-r--r--keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Service.java48
-rw-r--r--keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Services.java36
-rw-r--r--keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Token.java370
-rw-r--r--keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/User.java91
-rw-r--r--keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Users.java36
-rw-r--r--nova-client/pom.xml24
-rw-r--r--nova-client/src/main/java/com/woorea/openstack/nova/Nova.java113
-rw-r--r--nova-client/src/main/java/com/woorea/openstack/nova/api/ExtensionsResource.java30
-rw-r--r--nova-client/src/main/java/com/woorea/openstack/nova/api/FlavorsResource.java85
-rw-r--r--nova-client/src/main/java/com/woorea/openstack/nova/api/ImagesResource.java85
-rw-r--r--nova-client/src/main/java/com/woorea/openstack/nova/api/QuotaSetsResource.java61
-rw-r--r--nova-client/src/main/java/com/woorea/openstack/nova/api/ServersResource.java541
-rw-r--r--nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/AggregatesExtension.java163
-rw-r--r--nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/CloudpipesExtension.java49
-rw-r--r--nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/CredentialsExtension.java43
-rw-r--r--nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/FloatingIpDnsExtension.java89
-rw-r--r--nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/FloatingIpPoolsExtension.java31
-rw-r--r--nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/FloatingIpsExtension.java67
-rw-r--r--nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/HostsExtension.java44
-rw-r--r--nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/HypervisorsExtension.java5
-rw-r--r--nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/KeyPairsExtension.java65
-rw-r--r--nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/NetworksExtension.java82
-rw-r--r--nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/SecurityGroupsExtension.java184
-rw-r--r--nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/SnapshotsExtension.java86
-rw-r--r--nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/VolumesExtension.java106
-rw-r--r--nova-model/pom.xml12
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/Certificate.java36
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/Cloudpipe.java134
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/Cloudpipes.java28
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/Extension.java75
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/Extensions.java34
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/Flavor.java239
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/FlavorForCreate.java142
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/Flavors.java34
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/FloatingIp.java67
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/FloatingIpDomain.java58
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/FloatingIpDomains.java34
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/FloatingIpPools.java57
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/FloatingIps.java34
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/Host.java109
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/HostAggregate.java110
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/HostAggregates.java34
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/Hosts.java77
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/Image.java232
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/ImageFromVolume.java112
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/Images.java35
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/KeyPair.java98
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/KeyPairs.java46
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/Limits.java394
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/Link.java42
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/Metadata.java26
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/Network.java290
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/NetworkForCreate.java29
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/Networks.java34
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/PersonalityFile.java39
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/QuotaSet.java156
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/SecurityGroup.java207
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/SecurityGroupForCreate.java64
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/SecurityGroupRuleForCreate.java198
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/SecurityGroups.java34
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/Server.java514
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/ServerAction.java610
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/ServerForCreate.java326
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/Servers.java34
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/SimpleTenantUsage.java232
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/SimpleTenantUsages.java34
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/Snapshot.java87
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/SnapshotForCreate.java87
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/Snapshots.java34
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/Volume.java116
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/VolumeAttachment.java59
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/VolumeAttachments.java34
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/VolumeForCreate.java123
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/VolumeForImageCreate.java71
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/VolumeType.java10
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/VolumeTypes.java34
-rw-r--r--nova-model/src/main/java/com/woorea/openstack/nova/model/Volumes.java34
-rw-r--r--openstack-client-connectors/http-connector/pom.xml31
-rw-r--r--openstack-client-connectors/http-connector/src/main/java/com/woorea/openstack/connector/HttpClientConnector.java227
-rw-r--r--openstack-client-connectors/http-connector/src/main/java/com/woorea/openstack/connector/HttpClientException.java45
-rw-r--r--openstack-client-connectors/http-connector/src/main/java/com/woorea/openstack/connector/HttpClientRedirectStrategy.java109
-rw-r--r--openstack-client-connectors/http-connector/src/main/java/com/woorea/openstack/connector/HttpClientResponse.java110
-rw-r--r--openstack-client-connectors/http-connector/src/main/resources/META-INF/services/com.woorea.openstack.base.client.OpenStackClientConnector1
-rw-r--r--openstack-client-connectors/jersey-connector/pom.xml25
-rw-r--r--openstack-client-connectors/jersey-connector/src/main/java/com/woorea/openstack/connector/JerseyConnector.java104
-rw-r--r--openstack-client-connectors/jersey-connector/src/main/java/com/woorea/openstack/connector/JerseyLoggingFilter.java279
-rw-r--r--openstack-client-connectors/jersey-connector/src/main/java/com/woorea/openstack/connector/JerseyResponse.java66
-rw-r--r--openstack-client-connectors/jersey-connector/src/main/resources/META-INF/services/com.woorea.openstack.base.client.OpenStackClientConnector1
-rw-r--r--openstack-client-connectors/jersey2-connector/pom.xml35
-rw-r--r--openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/connector/JaxRs20Connector.java65
-rw-r--r--openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/connector/JaxRs20Response.java61
-rw-r--r--openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/connector/OpenStack.java110
-rw-r--r--openstack-client-connectors/jersey2-connector/src/main/resources/META-INF/services/com.woorea.openstack.base.client.OpenStackClientConnector1
-rw-r--r--openstack-client-connectors/pom.xml60
-rw-r--r--openstack-client-connectors/resteasy-connector/pom.xml30
-rw-r--r--openstack-client-connectors/resteasy-connector/src/main/java/com/woorea/openstack/connector/RESTEasyConnector.java125
-rw-r--r--openstack-client-connectors/resteasy-connector/src/main/java/com/woorea/openstack/connector/RESTEasyInputStream.java37
-rw-r--r--openstack-client-connectors/resteasy-connector/src/main/java/com/woorea/openstack/connector/RESTEasyResponse.java59
-rw-r--r--openstack-client-connectors/resteasy-connector/src/main/resources/META-INF/services/com.woorea.openstack.base.client.OpenStackClientConnector1
-rw-r--r--openstack-client/pom.xml12
-rw-r--r--openstack-client/src/main/java/com/woorea/openstack/base/client/Entity.java54
-rw-r--r--openstack-client/src/main/java/com/woorea/openstack/base/client/HttpMethod.java5
-rw-r--r--openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackBaseException.java46
-rw-r--r--openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackClient.java90
-rw-r--r--openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackClientConnector.java8
-rw-r--r--openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackCommand.java8
-rw-r--r--openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackConnectException.java42
-rw-r--r--openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackRequest.java142
-rw-r--r--openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackResponse.java22
-rw-r--r--openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackResponseException.java42
-rw-r--r--openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackResponseStatus.java11
-rw-r--r--openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackSimpleTokenProvider.java20
-rw-r--r--openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackTokenProvider.java9
-rw-r--r--openstack-client/src/main/java/com/woorea/openstack/common/client/AbstractOpenStackClient.java125
-rw-r--r--openstack-client/src/main/java/com/woorea/openstack/common/session/OpenStackSession.java107
-rw-r--r--openstack-client/src/main/java/com/woorea/openstack/common/session/OpenStackSessionHolder.java16
-rw-r--r--openstack-console/pom.xml78
-rw-r--r--openstack-console/src/main/java/com/woorea/openstack/console/Command.java21
-rw-r--r--openstack-console/src/main/java/com/woorea/openstack/console/CommandLineHelper.java71
-rw-r--r--openstack-console/src/main/java/com/woorea/openstack/console/Commands.java31
-rw-r--r--openstack-console/src/main/java/com/woorea/openstack/console/Console.java111
-rw-r--r--openstack-console/src/main/java/com/woorea/openstack/console/Environment.java30
-rw-r--r--openstack-console/src/main/java/com/woorea/openstack/console/Main.java27
-rw-r--r--openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneCommand.java24
-rw-r--r--openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneEnvironment.java63
-rw-r--r--openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneRoleCreate.java69
-rw-r--r--openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneRoleDelete.java25
-rw-r--r--openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneRoleList.java48
-rw-r--r--openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneServiceList.java48
-rw-r--r--openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneTenantCreate.java69
-rw-r--r--openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneTenantDelete.java25
-rw-r--r--openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneTenantList.java48
-rw-r--r--openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneUserCreate.java75
-rw-r--r--openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneUserDelete.java25
-rw-r--r--openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneUserList.java50
-rw-r--r--openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneUserShow.java53
-rw-r--r--openstack-console/src/main/java/com/woorea/openstack/console/nova/NovaCommand.java25
-rw-r--r--openstack-console/src/main/java/com/woorea/openstack/console/nova/NovaEnvironment.java65
-rw-r--r--openstack-console/src/main/java/com/woorea/openstack/console/nova/NovaServerList.java44
-rw-r--r--openstack-console/src/main/java/com/woorea/openstack/console/utils/Column.java65
-rw-r--r--openstack-console/src/main/java/com/woorea/openstack/console/utils/ConsoleUtils.java47
-rw-r--r--openstack-console/src/main/java/com/woorea/openstack/console/utils/Table.java81
-rw-r--r--openstack-console/src/main/java/com/woorea/openstack/console/utils/TableModel.java25
-rw-r--r--openstack-console/src/main/resources/console.properties6
-rw-r--r--openstack-examples/pom.xml84
-rw-r--r--openstack-examples/src/main/java/com/woorea/openstack/examples/ExamplesConfiguration.java34
-rw-r--r--openstack-examples/src/main/java/com/woorea/openstack/examples/compute/NovaCreateServer.java90
-rw-r--r--openstack-examples/src/main/java/com/woorea/openstack/examples/compute/NovaListFlavors.java51
-rw-r--r--openstack-examples/src/main/java/com/woorea/openstack/examples/compute/NovaListImages.java52
-rw-r--r--openstack-examples/src/main/java/com/woorea/openstack/examples/compute/NovaListServers.java38
-rw-r--r--openstack-examples/src/main/java/com/woorea/openstack/examples/compute/NovaStopStartServer.java40
-rw-r--r--openstack-examples/src/main/java/com/woorea/openstack/examples/glance/GlanceListImages.java83
-rw-r--r--openstack-examples/src/main/java/com/woorea/openstack/examples/heat/HeatListStacks.java76
-rw-r--r--openstack-examples/src/main/java/com/woorea/openstack/examples/hpcloud/Keystone3Authentication.java34
-rw-r--r--openstack-examples/src/main/java/com/woorea/openstack/examples/hpcloud/KeystoneAuthentication.java29
-rw-r--r--openstack-examples/src/main/java/com/woorea/openstack/examples/keystone/KeystoneCreateTenant.java36
-rw-r--r--openstack-examples/src/main/java/com/woorea/openstack/examples/keystone/KeystoneCreateUser.java38
-rw-r--r--openstack-examples/src/main/java/com/woorea/openstack/examples/metering/v2/TestAll.java62
-rw-r--r--openstack-examples/src/main/java/com/woorea/openstack/examples/network/QuantumListNetworks.java47
-rw-r--r--openstack-examples/src/main/java/com/woorea/openstack/examples/network/QuantumNetworkCreate.java108
-rw-r--r--openstack-examples/src/main/java/com/woorea/openstack/examples/network/QuantumQueryNetworks.java59
-rw-r--r--openstack-examples/src/main/java/com/woorea/openstack/examples/objectstore/SwiftExample.java90
-rw-r--r--openstack-examples/src/main/java/com/woorea/openstack/examples/simple/OpenStackSimpleClient.java15
-rw-r--r--openstack-java-sdk-master/.travis.yml3
-rw-r--r--pom.xml150
-rw-r--r--project-configs/maven/conf/settings.xml160
-rw-r--r--quantum-client/pom.xml25
-rw-r--r--quantum-client/src/main/java/com/woorea/openstack/quantum/Quantum.java51
-rw-r--r--quantum-client/src/main/java/com/woorea/openstack/quantum/api/NetworksResource.java84
-rw-r--r--quantum-client/src/main/java/com/woorea/openstack/quantum/api/PortsResource.java85
-rw-r--r--quantum-client/src/main/java/com/woorea/openstack/quantum/api/RoutersResource.java102
-rw-r--r--quantum-client/src/main/java/com/woorea/openstack/quantum/api/SubnetsResource.java84
-rw-r--r--quantum-client/src/main/java/com/woorea/openstack/quantum/api/query/AbsOpenStackCmd.java80
-rw-r--r--quantum-model/pom.xml20
-rw-r--r--quantum-model/src/main/java/com/woorea/openstack/quantum/model/GatewayInfo.java24
-rw-r--r--quantum-model/src/main/java/com/woorea/openstack/quantum/model/HostRoute.java27
-rw-r--r--quantum-model/src/main/java/com/woorea/openstack/quantum/model/Network.java321
-rw-r--r--quantum-model/src/main/java/com/woorea/openstack/quantum/model/NetworkForCreate.java9
-rw-r--r--quantum-model/src/main/java/com/woorea/openstack/quantum/model/Networks.java38
-rw-r--r--quantum-model/src/main/java/com/woorea/openstack/quantum/model/NeutronError.java69
-rw-r--r--quantum-model/src/main/java/com/woorea/openstack/quantum/model/Pool.java40
-rw-r--r--quantum-model/src/main/java/com/woorea/openstack/quantum/model/Port.java373
-rw-r--r--quantum-model/src/main/java/com/woorea/openstack/quantum/model/PortForCreate.java12
-rw-r--r--quantum-model/src/main/java/com/woorea/openstack/quantum/model/Ports.java40
-rw-r--r--quantum-model/src/main/java/com/woorea/openstack/quantum/model/Router.java77
-rw-r--r--quantum-model/src/main/java/com/woorea/openstack/quantum/model/RouterForAddInterface.java28
-rw-r--r--quantum-model/src/main/java/com/woorea/openstack/quantum/model/RouterForCreate.java75
-rw-r--r--quantum-model/src/main/java/com/woorea/openstack/quantum/model/RouterInterface.java19
-rw-r--r--quantum-model/src/main/java/com/woorea/openstack/quantum/model/Routers.java38
-rw-r--r--quantum-model/src/main/java/com/woorea/openstack/quantum/model/Segment.java79
-rw-r--r--quantum-model/src/main/java/com/woorea/openstack/quantum/model/Subnet.java264
-rw-r--r--quantum-model/src/main/java/com/woorea/openstack/quantum/model/SubnetForCreate.java34
-rw-r--r--quantum-model/src/main/java/com/woorea/openstack/quantum/model/Subnets.java36
-rw-r--r--quantum-model/src/test/java/com/woorea/openstack/quantum/model/NetworkTest.java119
-rw-r--r--quantum-model/src/test/java/com/woorea/openstack/quantum/model/PortTest.java155
-rw-r--r--quantum-model/src/test/java/com/woorea/openstack/quantum/model/SubnetTest.java137
-rw-r--r--swift-client/pom.xml24
-rw-r--r--swift-client/src/main/java/com/woorea/openstack/swift/Swift.java33
-rw-r--r--swift-client/src/main/java/com/woorea/openstack/swift/api/AccountResource.java22
-rw-r--r--swift-client/src/main/java/com/woorea/openstack/swift/api/ContainerResource.java143
-rw-r--r--swift-client/src/main/java/com/woorea/openstack/swift/api/ContainersResource.java74
-rw-r--r--swift-model/pom.xml12
-rw-r--r--swift-model/src/main/java/com/woorea/openstack/swift/model/Account.java64
-rw-r--r--swift-model/src/main/java/com/woorea/openstack/swift/model/Container.java70
-rw-r--r--swift-model/src/main/java/com/woorea/openstack/swift/model/Object.java109
-rw-r--r--swift-model/src/main/java/com/woorea/openstack/swift/model/ObjectDownload.java41
-rw-r--r--swift-model/src/main/java/com/woorea/openstack/swift/model/ObjectForUpload.java72
-rw-r--r--version.properties14
313 files changed, 23023 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..0aab431
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,8 @@
+target
+.settings
+.classpath
+.project
+.buildpath
+.idea
+*.iml
+
diff --git a/.gitreview b/.gitreview
new file mode 100644
index 0000000..8fd309d
--- /dev/null
+++ b/.gitreview
@@ -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
index 0000000..d645695
--- /dev/null
+++ b/LICENSE.txt
@@ -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
index 0000000..ff07ffa
--- /dev/null
+++ b/README.textile
@@ -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
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
index 0000000..e3deb68
--- /dev/null
+++ b/ceilometer-client/pom.xml
@@ -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
index 0000000..05cda35
--- /dev/null
+++ b/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/Ceilometer.java
@@ -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
index 0000000..444c052
--- /dev/null
+++ b/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/QueriableCeilometerCommand.java
@@ -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
index 0000000..e44dbe6
--- /dev/null
+++ b/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/v2/api/MetersResource.java
@@ -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
index 0000000..9001687
--- /dev/null
+++ b/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/v2/api/ResourcesResource.java
@@ -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
index 0000000..9f0abe6
--- /dev/null
+++ b/ceilometer-model/pom.xml
@@ -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
index 0000000..df9182f
--- /dev/null
+++ b/ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Meter.java
@@ -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
index 0000000..24e14aa
--- /dev/null
+++ b/ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Resource.java
@@ -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
index 0000000..8827de4
--- /dev/null
+++ b/ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Sample.java
@@ -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
index 0000000..5a34fe5
--- /dev/null
+++ b/ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Statistics.java
@@ -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
index 0000000..80c62cd
--- /dev/null
+++ b/glance-client/pom.xml
@@ -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
index 0000000..67714e7
--- /dev/null
+++ b/glance-client/src/main/java/com/woorea/openstack/glance/Glance.java
@@ -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
index 0000000..ae46548
--- /dev/null
+++ b/glance-client/src/main/java/com/woorea/openstack/glance/ImagesResource.java
@@ -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
index 0000000..a461554
--- /dev/null
+++ b/glance-client/src/main/java/com/woorea/openstack/glance/SharedImagesResource.java
@@ -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
index 0000000..613ad97
--- /dev/null
+++ b/glance-model/pom.xml
@@ -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
index 0000000..4bd49e0
--- /dev/null
+++ b/glance-model/src/main/java/com/woorea/openstack/glance/model/Image.java
@@ -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
index 0000000..d7c575c
--- /dev/null
+++ b/glance-model/src/main/java/com/woorea/openstack/glance/model/ImageDownload.java
@@ -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
index 0000000..4b8c3e7
--- /dev/null
+++ b/glance-model/src/main/java/com/woorea/openstack/glance/model/ImageMember.java
@@ -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
index 0000000..68aa176
--- /dev/null
+++ b/glance-model/src/main/java/com/woorea/openstack/glance/model/ImageMembers.java
@@ -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
index 0000000..326f5e0
--- /dev/null
+++ b/glance-model/src/main/java/com/woorea/openstack/glance/model/ImageUpload.java
@@ -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
index 0000000..af612ba
--- /dev/null
+++ b/glance-model/src/main/java/com/woorea/openstack/glance/model/Images.java
@@ -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
index 0000000..ae23a66
--- /dev/null
+++ b/glance-model/src/main/java/com/woorea/openstack/glance/model/SharedImage.java
@@ -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
index 0000000..111d094
--- /dev/null
+++ b/glance-model/src/main/java/com/woorea/openstack/glance/model/SharedImages.java
@@ -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
index 0000000..b94cf80
--- /dev/null
+++ b/heat-client/pom.xml
@@ -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
index 0000000..96e9cd7
--- /dev/null
+++ b/heat-client/src/main/java/com/woorea/openstack/heat/Heat.java
@@ -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
index 0000000..c3635bc
--- /dev/null
+++ b/heat-client/src/main/java/com/woorea/openstack/heat/ResourcesResource.java
@@ -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
index 0000000..055a5c4
--- /dev/null
+++ b/heat-client/src/main/java/com/woorea/openstack/heat/StackResource.java
@@ -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
index 0000000..103ca4e
--- /dev/null
+++ b/heat-model/pom.xml
@@ -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
index 0000000..bcf3e8a
--- /dev/null
+++ b/heat-model/src/main/java/com/woorea/openstack/heat/model/CreateStackParam.java
@@ -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
index 0000000..816d2f8
--- /dev/null
+++ b/heat-model/src/main/java/com/woorea/openstack/heat/model/Explanation.java
@@ -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
index 0000000..ec1970f
--- /dev/null
+++ b/heat-model/src/main/java/com/woorea/openstack/heat/model/Link.java
@@ -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
index 0000000..159bbcd
--- /dev/null
+++ b/heat-model/src/main/java/com/woorea/openstack/heat/model/Resource.java
@@ -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
index 0000000..068c5e0
--- /dev/null
+++ b/heat-model/src/main/java/com/woorea/openstack/heat/model/Resources.java
@@ -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
index 0000000..5f58195
--- /dev/null
+++ b/heat-model/src/main/java/com/woorea/openstack/heat/model/Stack.java
@@ -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
index 0000000..6f174aa
--- /dev/null
+++ b/heat-model/src/main/java/com/woorea/openstack/heat/model/Stacks.java
@@ -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
index 0000000..5aa0b76
--- /dev/null
+++ b/heat-model/src/main/java/com/woorea/openstack/heat/model/UpdateStackParam.java
@@ -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
index 0000000..cca8bda
--- /dev/null
+++ b/keystone-client/pom.xml
@@ -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
index 0000000..38d42f0
--- /dev/null
+++ b/keystone-client/src/main/java/com/woorea/openstack/keystone/Keystone.java
@@ -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
index 0000000..acc128b
--- /dev/null
+++ b/keystone-client/src/main/java/com/woorea/openstack/keystone/api/EndpointsResource.java
@@ -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
index 0000000..d39dc77
--- /dev/null
+++ b/keystone-client/src/main/java/com/woorea/openstack/keystone/api/RolesResource.java
@@ -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
index 0000000..5b18939
--- /dev/null
+++ b/keystone-client/src/main/java/com/woorea/openstack/keystone/api/ServicesResource.java
@@ -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
index 0000000..a073241
--- /dev/null
+++ b/keystone-client/src/main/java/com/woorea/openstack/keystone/api/TenantsResource.java
@@ -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
index 0000000..4f30313
--- /dev/null
+++ b/keystone-client/src/main/java/com/woorea/openstack/keystone/api/TokensResource.java
@@ -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
index 0000000..dbb897c
--- /dev/null
+++ b/keystone-client/src/main/java/com/woorea/openstack/keystone/api/UsersResource.java
@@ -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
index 0000000..fb5127a
--- /dev/null
+++ b/keystone-client/src/main/java/com/woorea/openstack/keystone/utils/KeystoneTokenProvider.java
@@ -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
index 0000000..8269597
--- /dev/null
+++ b/keystone-client/src/main/java/com/woorea/openstack/keystone/utils/KeystoneUtils.java
@@ -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
index 0000000..6ff889c
--- /dev/null
+++ b/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/Keystone.java
@@ -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
index 0000000..7be2620
--- /dev/null
+++ b/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/CredentialsResources.java
@@ -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
index 0000000..a041ba2
--- /dev/null
+++ b/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/DomainGroupRolesResource.java
@@ -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
index 0000000..9a6e8e5
--- /dev/null
+++ b/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/DomainUserRolesResource.java
@@ -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
index 0000000..28015ee
--- /dev/null
+++ b/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/DomainsResource.java
@@ -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
index 0000000..d1db88a
--- /dev/null
+++ b/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/EndpointsResource.java
@@ -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
index 0000000..117e941
--- /dev/null
+++ b/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/GenericResource.java
@@ -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
index 0000000..60cce41
--- /dev/null
+++ b/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/GroupUsersResource.java
@@ -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
index 0000000..be380cc
--- /dev/null
+++ b/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/GroupsResource.java
@@ -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
index 0000000..ba16a46
--- /dev/null
+++ b/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/PoliciesResource.java
@@ -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
index 0000000..caed8ac
--- /dev/null
+++ b/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/ProjectGroupRolesResource.java
@@ -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
index 0000000..7e7e2fa
--- /dev/null
+++ b/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/ProjectRolesResource.java
@@ -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
index 0000000..9f3dc50
--- /dev/null
+++ b/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/ProjectUserRolesResource.java
@@ -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
index 0000000..2e9fd9a
--- /dev/null
+++ b/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/ProjectsResource.java
@@ -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
index 0000000..2c28a1b
--- /dev/null
+++ b/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/RolesResource.java
@@ -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
index 0000000..4742a2f
--- /dev/null
+++ b/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/ServicesResource.java
@@ -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
index 0000000..c2d53b3
--- /dev/null
+++ b/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/TokensResource.java
@@ -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
index 0000000..d6a6d14
--- /dev/null
+++ b/keystone-client/src/main/java/com/woorea/openstack/keystone/v3/api/UsersResource.java
@@ -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
index 0000000..512e40b
--- /dev/null
+++ b/keystone-model/pom.xml
@@ -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
index 0000000..a7968ff
--- /dev/null
+++ b/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Access.java
@@ -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
index 0000000..f5c8f5c
--- /dev/null
+++ b/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Authentication.java
@@ -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
index 0000000..f179e25
--- /dev/null
+++ b/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Endpoint.java
@@ -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
index 0000000..d7a5898
--- /dev/null
+++ b/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Endpoints.java
@@ -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
index 0000000..5549f4c
--- /dev/null
+++ b/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Error.java
@@ -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
index 0000000..a673bca
--- /dev/null
+++ b/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Link.java
@@ -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
index 0000000..295f9cd
--- /dev/null
+++ b/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Metadata.java
@@ -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
index 0000000..993b0d9
--- /dev/null
+++ b/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Role.java
@@ -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
index 0000000..22e18ed
--- /dev/null
+++ b/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Roles.java
@@ -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
index 0000000..ed9eb53
--- /dev/null
+++ b/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Service.java
@@ -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
index 0000000..5c7958c
--- /dev/null
+++ b/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Services.java
@@ -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
index 0000000..a20b71b
--- /dev/null
+++ b/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Tenant.java
@@ -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
index 0000000..51e370c
--- /dev/null
+++ b/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Tenants.java
@@ -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
index 0000000..92d34ee
--- /dev/null
+++ b/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Token.java
@@ -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
index 0000000..ad0b788
--- /dev/null
+++ b/keystone-model/src/main/java/com/woorea/openstack/keystone/model/User.java
@@ -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
index 0000000..c88aabc
--- /dev/null
+++ b/keystone-model/src/main/java/com/woorea/openstack/keystone/model/Users.java
@@ -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
index 0000000..4767450
--- /dev/null
+++ b/keystone-model/src/main/java/com/woorea/openstack/keystone/model/authentication/AccessKey.java
@@ -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
index 0000000..7007d02
--- /dev/null
+++ b/keystone-model/src/main/java/com/woorea/openstack/keystone/model/authentication/RackspaceAuthentication.java
@@ -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
index 0000000..68cfcd2
--- /dev/null
+++ b/keystone-model/src/main/java/com/woorea/openstack/keystone/model/authentication/TokenAuthentication.java
@@ -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
index 0000000..ee94692
--- /dev/null
+++ b/keystone-model/src/main/java/com/woorea/openstack/keystone/model/authentication/UsernamePassword.java
@@ -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
index 0000000..7caffb0
--- /dev/null
+++ b/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Authentication.java
@@ -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
index 0000000..ef40a2a
--- /dev/null
+++ b/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Credential.java
@@ -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
index 0000000..36eeda6
--- /dev/null
+++ b/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Credentials.java
@@ -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
index 0000000..9df4fe2
--- /dev/null
+++ b/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Domain.java
@@ -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
index 0000000..e42a6c4
--- /dev/null
+++ b/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Domains.java
@@ -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
index 0000000..213e690
--- /dev/null
+++ b/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Endpoint.java
@@ -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
index 0000000..146e88b
--- /dev/null
+++ b/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Endpoints.java
@@ -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
index 0000000..5e718b5
--- /dev/null
+++ b/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Group.java
@@ -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
index 0000000..cc7b276
--- /dev/null
+++ b/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Groups.java
@@ -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
index 0000000..42da856
--- /dev/null
+++ b/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Policies.java
@@ -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
index 0000000..5abf844
--- /dev/null
+++ b/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Policy.java
@@ -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
index 0000000..070336e
--- /dev/null
+++ b/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Project.java
@@ -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
index 0000000..fa39064
--- /dev/null
+++ b/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Projects.java
@@ -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
index 0000000..09d47a1
--- /dev/null
+++ b/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Role.java
@@ -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
index 0000000..5a4e3b4
--- /dev/null
+++ b/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Roles.java
@@ -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
index 0000000..578f2c1
--- /dev/null
+++ b/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Service.java
@@ -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
index 0000000..4383aec
--- /dev/null
+++ b/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Services.java
@@ -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
index 0000000..aee6fe5
--- /dev/null
+++ b/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Token.java
@@ -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
index 0000000..3b1787b
--- /dev/null
+++ b/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/User.java
@@ -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
index 0000000..fa3c6d4
--- /dev/null
+++ b/keystone-model/src/main/java/com/woorea/openstack/keystone/v3/model/Users.java
@@ -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
index 0000000..d25fc05
--- /dev/null
+++ b/nova-client/pom.xml
@@ -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
index 0000000..f81de7d
--- /dev/null
+++ b/nova-client/src/main/java/com/woorea/openstack/nova/Nova.java
@@ -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
index 0000000..46e16c4
--- /dev/null
+++ b/nova-client/src/main/java/com/woorea/openstack/nova/api/ExtensionsResource.java
@@ -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
index 0000000..c3e2256
--- /dev/null
+++ b/nova-client/src/main/java/com/woorea/openstack/nova/api/FlavorsResource.java
@@ -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
index 0000000..780cb12
--- /dev/null
+++ b/nova-client/src/main/java/com/woorea/openstack/nova/api/ImagesResource.java
@@ -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
index 0000000..166fb42
--- /dev/null
+++ b/nova-client/src/main/java/com/woorea/openstack/nova/api/QuotaSetsResource.java
@@ -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
index 0000000..ca48b6f
--- /dev/null
+++ b/nova-client/src/main/java/com/woorea/openstack/nova/api/ServersResource.java
@@ -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
index 0000000..fa757af
--- /dev/null
+++ b/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/AggregatesExtension.java
@@ -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
index 0000000..90450c8
--- /dev/null
+++ b/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/CloudpipesExtension.java
@@ -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
index 0000000..b689fd6
--- /dev/null
+++ b/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/CredentialsExtension.java
@@ -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
index 0000000..e2a399a
--- /dev/null
+++ b/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/FloatingIpDnsExtension.java
@@ -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
index 0000000..cfcba23
--- /dev/null
+++ b/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/FloatingIpPoolsExtension.java
@@ -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
index 0000000..0923b7e
--- /dev/null
+++ b/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/FloatingIpsExtension.java
@@ -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
index 0000000..9a4814d
--- /dev/null
+++ b/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/HostsExtension.java
@@ -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
index 0000000..ed1ad10
--- /dev/null
+++ b/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/HypervisorsExtension.java
@@ -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
index 0000000..5e2c555
--- /dev/null
+++ b/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/KeyPairsExtension.java
@@ -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
index 0000000..ad316e0
--- /dev/null
+++ b/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/NetworksExtension.java
@@ -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
index 0000000..5a80a10
--- /dev/null
+++ b/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/SecurityGroupsExtension.java
@@ -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
index 0000000..62c2542
--- /dev/null
+++ b/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/SnapshotsExtension.java
@@ -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
index 0000000..de35577
--- /dev/null
+++ b/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/VolumesExtension.java
@@ -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
index 0000000..8e4c550
--- /dev/null
+++ b/nova-model/pom.xml
@@ -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
index 0000000..b69eb3c
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/Certificate.java
@@ -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
index 0000000..69d1b5a
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/Cloudpipe.java
@@ -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
index 0000000..3a3f13e
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/Cloudpipes.java
@@ -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
index 0000000..20892b7
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/Extension.java
@@ -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
index 0000000..5d049d9
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/Extensions.java
@@ -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
index 0000000..1076062
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/Flavor.java
@@ -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
index 0000000..295096d
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/FlavorForCreate.java
@@ -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
index 0000000..0337a3b
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/Flavors.java
@@ -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
index 0000000..3eda923
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/FloatingIp.java
@@ -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
index 0000000..4a6a280
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/FloatingIpDomain.java
@@ -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
index 0000000..292b59f
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/FloatingIpDomains.java
@@ -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
index 0000000..db1c0e3
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/FloatingIpPools.java
@@ -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
index 0000000..776c4ca
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/FloatingIps.java
@@ -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
index 0000000..4050964
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/Host.java
@@ -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
index 0000000..ad68faa
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/HostAggregate.java
@@ -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
index 0000000..6810e83
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/HostAggregates.java
@@ -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
index 0000000..1bac38e
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/Hosts.java
@@ -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
index 0000000..93949f2
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/Image.java
@@ -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
index 0000000..30e38d8
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/ImageFromVolume.java
@@ -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
index 0000000..e678e97
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/Images.java
@@ -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
index 0000000..b2fdb34
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/KeyPair.java
@@ -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
index 0000000..62f158f
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/KeyPairs.java
@@ -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
index 0000000..86e9acf
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/Limits.java
@@ -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
index 0000000..f973bec
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/Link.java
@@ -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
index 0000000..a3dbffb
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/Metadata.java
@@ -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
index 0000000..6e82c1d
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/Network.java
@@ -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
index 0000000..f578539
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/NetworkForCreate.java
@@ -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
index 0000000..6e8a941
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/Networks.java
@@ -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
index 0000000..c4ff307
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/PersonalityFile.java
@@ -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
index 0000000..0a2f55d
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/QuotaSet.java
@@ -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
index 0000000..1b8917b
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/SecurityGroup.java
@@ -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
index 0000000..c3993bb
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/SecurityGroupForCreate.java
@@ -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
index 0000000..2f58da0
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/SecurityGroupRuleForCreate.java
@@ -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
index 0000000..1c8cc55
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/SecurityGroups.java
@@ -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
index 0000000..589ed54
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/Server.java
@@ -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
index 0000000..26fa5a4
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/ServerAction.java
@@ -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
index 0000000..9f28a81
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/ServerForCreate.java
@@ -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
index 0000000..a144250
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/Servers.java
@@ -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
index 0000000..f75414d
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/SimpleTenantUsage.java
@@ -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
index 0000000..33c4625
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/SimpleTenantUsages.java
@@ -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
index 0000000..06b9c4d
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/Snapshot.java
@@ -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
index 0000000..5db392e
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/SnapshotForCreate.java
@@ -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
index 0000000..006d30c
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/Snapshots.java
@@ -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
index 0000000..d4b7e6e
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/Volume.java
@@ -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
index 0000000..54abc9e
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/VolumeAttachment.java
@@ -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
index 0000000..be5ea8e
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/VolumeAttachments.java
@@ -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
index 0000000..c4a09a3
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/VolumeForCreate.java
@@ -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
index 0000000..994d49a
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/VolumeForImageCreate.java
@@ -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
index 0000000..4c25e4b
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/VolumeType.java
@@ -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
index 0000000..42d8162
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/VolumeTypes.java
@@ -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
index 0000000..349ef87
--- /dev/null
+++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/Volumes.java
@@ -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
index 0000000..375f579
--- /dev/null
+++ b/openstack-client-connectors/http-connector/pom.xml
@@ -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
index 0000000..d748a79
--- /dev/null
+++ b/openstack-client-connectors/http-connector/src/main/java/com/woorea/openstack/connector/HttpClientConnector.java
@@ -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
index 0000000..9f93455
--- /dev/null
+++ b/openstack-client-connectors/http-connector/src/main/java/com/woorea/openstack/connector/HttpClientException.java
@@ -0,0 +1,45 @@
+/*
+ * ============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;
+
+/*
+ * Declare a RuntimeException since the Interface does not declare any
+ * throwables. Any caught exception will be wrapped in HttpClientException
+ */
+public class HttpClientException extends RuntimeException {
+
+ private static final long serialVersionUID = 1L;
+
+ public HttpClientException (String s) {
+ super (s);
+ }
+
+ public HttpClientException (Exception e) {
+ super ("Caught nested exception in HttpClient", e);
+ }
+
+ public HttpClientException (String s, Exception e) {
+ super (s, e);
+ }
+}
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
index 0000000..88f20bb
--- /dev/null
+++ b/openstack-client-connectors/http-connector/src/main/java/com/woorea/openstack/connector/HttpClientRedirectStrategy.java
@@ -0,0 +1,109 @@
+/*
+ * ============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.net.URI;
+
+import org.apache.http.HttpRequest;
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpStatus;
+import org.apache.http.ProtocolException;
+import org.apache.http.annotation.Immutable;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpHead;
+import org.apache.http.client.methods.HttpDelete;
+import org.apache.http.client.methods.HttpUriRequest;
+import org.apache.http.client.methods.RequestBuilder;
+import org.apache.http.impl.client.DefaultRedirectStrategy;
+import org.apache.http.protocol.HttpContext;
+
+/**
+ * Custom {@link org.apache.http.client.RedirectStrategy} implementation
+ * that automatically redirects all HEAD, GET and DELETE requests.
+ * The {@link org.apache.http.client.DefaultRedirectStrategy} only
+ * redirects GET and HEAD automatically, per the HTTP specification
+ * (POST and PUT typically have bodies and thus cannot be redirected).
+ *
+ * A custom strategy is needed for the Openstack API, which can also send
+ * 302 on a DELETE (by name) request, expecting the client to follow the
+ * redirect to perform the actual deletion.
+ */
+@Immutable
+public class HttpClientRedirectStrategy extends DefaultRedirectStrategy {
+
+ /**
+ * Redirectable methods.
+ */
+ private static final String[] REDIRECT_METHODS = new String[] {
+ HttpGet.METHOD_NAME,
+ HttpDelete.METHOD_NAME,
+ HttpHead.METHOD_NAME
+ };
+
+ /**
+ * Determine if the request should be redirected.
+ * This may not actually be needed, since the REDIRECT_METHODS
+ * array has been updated with the DELETE.
+ */
+ @Override
+ protected boolean isRedirectable(final String method) {
+ for (final String m: REDIRECT_METHODS) {
+ if (m.equalsIgnoreCase(method)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Override the default redirect handling method. As implemented
+ * in HttpClient, it does not preserve the method on 301 or 302
+ * responses, always redirecting to a GET.
+ */
+ @Override
+ public HttpUriRequest getRedirect(
+ final HttpRequest request,
+ final HttpResponse response,
+ final HttpContext context) throws ProtocolException {
+
+ final URI uri = getLocationURI(request, response, context);
+ final String method = request.getRequestLine().getMethod();
+ if (method.equalsIgnoreCase(HttpHead.METHOD_NAME)) {
+ return new HttpHead(uri);
+ } else if (method.equalsIgnoreCase(HttpGet.METHOD_NAME)) {
+ return new HttpGet(uri);
+ } else {
+
+ final int status = response.getStatusLine().getStatusCode();
+
+ HttpUriRequest newRequest = null;
+ if (status == HttpStatus.SC_TEMPORARY_REDIRECT || status == HttpStatus.SC_MOVED_TEMPORARILY) {
+ newRequest = RequestBuilder.copy(request).setUri(uri).build();
+ } else {
+ newRequest = new HttpGet(uri);
+ }
+ return newRequest;
+ }
+ }
+}
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
index 0000000..e1850a2
--- /dev/null
+++ b/openstack-client-connectors/http-connector/src/main/java/com/woorea/openstack/connector/HttpClientResponse.java
@@ -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
index 0000000..1281d32
--- /dev/null
+++ b/openstack-client-connectors/http-connector/src/main/resources/META-INF/services/com.woorea.openstack.base.client.OpenStackClientConnector
@@ -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
index 0000000..24489d9
--- /dev/null
+++ b/openstack-client-connectors/jersey-connector/pom.xml
@@ -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
index 0000000..afd7a2b
--- /dev/null
+++ b/openstack-client-connectors/jersey-connector/src/main/java/com/woorea/openstack/connector/JerseyConnector.java
@@ -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
index 0000000..c1877c3
--- /dev/null
+++ b/openstack-client-connectors/jersey-connector/src/main/java/com/woorea/openstack/connector/JerseyLoggingFilter.java
@@ -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
index 0000000..5e8dc8c
--- /dev/null
+++ b/openstack-client-connectors/jersey-connector/src/main/java/com/woorea/openstack/connector/JerseyResponse.java
@@ -0,0 +1,66 @@
+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 com.sun.jersey.api.client.ClientResponse;
+import com.woorea.openstack.base.client.OpenStackResponse;
+import com.woorea.openstack.base.client.OpenStackResponseException;
+
+public class JerseyResponse implements OpenStackResponse {
+
+ private ClientResponse response;
+
+ public JerseyResponse(ClientResponse response) {
+ this.response = response;
+ }
+
+ @Override
+ public <T> T getEntity(Class<T> returnType) {
+ if(response.getStatus() >= 400) {
+ throw new OpenStackResponseException(response.getClientResponseStatus().getReasonPhrase(),
+ response.getStatus(), this);
+ }
+ if(response.hasEntity() && returnType != null && Void.class != returnType) {
+ return response.getEntity(returnType);
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public <T> T getErrorEntity(Class<T> returnType) {
+ if(response.getStatus() >= 400 && response.hasEntity()) {
+ return response.getEntity(returnType);
+ }
+ return null;
+ }
+
+ @Override
+ public InputStream getInputStream() {
+ if(response.hasEntity()) {
+ return response.getEntityInputStream();
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public String header(String name) {
+ return response.getHeaders().getFirst(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.getHeaders().getFirst(k));
+ }
+ return headers;
+ }
+}
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
index 0000000..5b9a158
--- /dev/null
+++ b/openstack-client-connectors/jersey-connector/src/main/resources/META-INF/services/com.woorea.openstack.base.client.OpenStackClientConnector
@@ -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
index 0000000..4cf7e83
--- /dev/null
+++ b/openstack-client-connectors/jersey2-connector/pom.xml
@@ -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
index 0000000..2171bea
--- /dev/null
+++ b/openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/connector/JaxRs20Connector.java
@@ -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
index 0000000..f27f337
--- /dev/null
+++ b/openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/connector/JaxRs20Response.java
@@ -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
index 0000000..f514cc8
--- /dev/null
+++ b/openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/connector/OpenStack.java
@@ -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
index 0000000..fc24457
--- /dev/null
+++ b/openstack-client-connectors/jersey2-connector/src/main/resources/META-INF/services/com.woorea.openstack.base.client.OpenStackClientConnector
@@ -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
index 0000000..6db50a8
--- /dev/null
+++ b/openstack-client-connectors/pom.xml
@@ -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
index 0000000..6cbdd3a
--- /dev/null
+++ b/openstack-client-connectors/resteasy-connector/pom.xml
@@ -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
index 0000000..b2ec415
--- /dev/null
+++ b/openstack-client-connectors/resteasy-connector/src/main/java/com/woorea/openstack/connector/RESTEasyConnector.java
@@ -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
index 0000000..913a500
--- /dev/null
+++ b/openstack-client-connectors/resteasy-connector/src/main/java/com/woorea/openstack/connector/RESTEasyInputStream.java
@@ -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
index 0000000..82e3187
--- /dev/null
+++ b/openstack-client-connectors/resteasy-connector/src/main/java/com/woorea/openstack/connector/RESTEasyResponse.java
@@ -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
index 0000000..dbb991d
--- /dev/null
+++ b/openstack-client-connectors/resteasy-connector/src/main/resources/META-INF/services/com.woorea.openstack.base.client.OpenStackClientConnector
@@ -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
index 0000000..ac668b0
--- /dev/null
+++ b/openstack-client/pom.xml
@@ -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
index 0000000..42eb5fd
--- /dev/null
+++ b/openstack-client/src/main/java/com/woorea/openstack/base/client/Entity.java
@@ -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
index 0000000..6c62ffb
--- /dev/null
+++ b/openstack-client/src/main/java/com/woorea/openstack/base/client/HttpMethod.java
@@ -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
index 0000000..1827ae1
--- /dev/null
+++ b/openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackBaseException.java
@@ -0,0 +1,46 @@
+/*
+ * ============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;
+
+/**
+ * A common abstract parent of all Openstack Exception types, allowing
+ * calling classes the choice to catch all error exceptions together.
+ */
+public abstract class OpenStackBaseException extends RuntimeException
+{
+ private static final long serialVersionUID = 1L;
+
+ /*
+ * Implement only the basic constructors
+ */
+ public OpenStackBaseException () {}
+
+ public OpenStackBaseException(String message) {
+ super(message);
+ }
+
+ public OpenStackBaseException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
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
index 0000000..57a6628
--- /dev/null
+++ b/openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackClient.java
@@ -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
index 0000000..417b844
--- /dev/null
+++ b/openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackClientConnector.java
@@ -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
index 0000000..5ef291f
--- /dev/null
+++ b/openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackCommand.java
@@ -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
index 0000000..aabcd1f
--- /dev/null
+++ b/openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackConnectException.java
@@ -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
index 0000000..94a545f
--- /dev/null
+++ b/openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackRequest.java
@@ -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
index 0000000..1e09320
--- /dev/null
+++ b/openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackResponse.java
@@ -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
index 0000000..355c300
--- /dev/null
+++ b/openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackResponseException.java
@@ -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
index 0000000..032a511
--- /dev/null
+++ b/openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackResponseStatus.java
@@ -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
index 0000000..5ea8d76
--- /dev/null
+++ b/openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackSimpleTokenProvider.java
@@ -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
index 0000000..0a8f1bf
--- /dev/null
+++ b/openstack-client/src/main/java/com/woorea/openstack/base/client/OpenStackTokenProvider.java
@@ -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
index 0000000..e48ec0b
--- /dev/null
+++ b/openstack-client/src/main/java/com/woorea/openstack/common/client/AbstractOpenStackClient.java
@@ -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
index 0000000..a56a3af
--- /dev/null
+++ b/openstack-client/src/main/java/com/woorea/openstack/common/session/OpenStackSession.java
@@ -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
index 0000000..ea81f7c
--- /dev/null
+++ b/openstack-client/src/main/java/com/woorea/openstack/common/session/OpenStackSessionHolder.java
@@ -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
index 0000000..2990671
--- /dev/null
+++ b/openstack-console/pom.xml
@@ -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
index 0000000..4c96e25
--- /dev/null
+++ b/openstack-console/src/main/java/com/woorea/openstack/console/Command.java
@@ -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
index 0000000..6e148ce
--- /dev/null
+++ b/openstack-console/src/main/java/com/woorea/openstack/console/CommandLineHelper.java
@@ -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
index 0000000..e8b39dc
--- /dev/null
+++ b/openstack-console/src/main/java/com/woorea/openstack/console/Commands.java
@@ -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
index 0000000..13b7fbf
--- /dev/null
+++ b/openstack-console/src/main/java/com/woorea/openstack/console/Console.java
@@ -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
index 0000000..ca0eee4
--- /dev/null
+++ b/openstack-console/src/main/java/com/woorea/openstack/console/Environment.java
@@ -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
index 0000000..d469e54
--- /dev/null
+++ b/openstack-console/src/main/java/com/woorea/openstack/console/Main.java
@@ -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
index 0000000..f15ad24
--- /dev/null
+++ b/openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneCommand.java
@@ -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
index 0000000..0d0a6a2
--- /dev/null
+++ b/openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneEnvironment.java
@@ -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
index 0000000..2acdd76
--- /dev/null
+++ b/openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneRoleCreate.java
@@ -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
index 0000000..d3977b7
--- /dev/null
+++ b/openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneRoleDelete.java
@@ -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
index 0000000..13b7175
--- /dev/null
+++ b/openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneRoleList.java
@@ -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
index 0000000..27542c1
--- /dev/null
+++ b/openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneServiceList.java
@@ -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
index 0000000..a8336ea
--- /dev/null
+++ b/openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneTenantCreate.java
@@ -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
index 0000000..a79da6a
--- /dev/null
+++ b/openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneTenantDelete.java
@@ -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
index 0000000..24ff73b
--- /dev/null
+++ b/openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneTenantList.java
@@ -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
index 0000000..2628767
--- /dev/null
+++ b/openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneUserCreate.java
@@ -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
index 0000000..77deff4
--- /dev/null
+++ b/openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneUserDelete.java
@@ -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
index 0000000..90bcde4
--- /dev/null
+++ b/openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneUserList.java
@@ -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
index 0000000..29a447f
--- /dev/null
+++ b/openstack-console/src/main/java/com/woorea/openstack/console/keystone/KeystoneUserShow.java
@@ -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
index 0000000..b406fbc
--- /dev/null
+++ b/openstack-console/src/main/java/com/woorea/openstack/console/nova/NovaCommand.java
@@ -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
index 0000000..bb2e5c4
--- /dev/null
+++ b/openstack-console/src/main/java/com/woorea/openstack/console/nova/NovaEnvironment.java
@@ -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
index 0000000..515ca2b
--- /dev/null
+++ b/openstack-console/src/main/java/com/woorea/openstack/console/nova/NovaServerList.java
@@ -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
index 0000000..08ffa19
--- /dev/null
+++ b/openstack-console/src/main/java/com/woorea/openstack/console/utils/Column.java
@@ -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
index 0000000..8212db6
--- /dev/null
+++ b/openstack-console/src/main/java/com/woorea/openstack/console/utils/ConsoleUtils.java
@@ -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
index 0000000..b49ede5
--- /dev/null
+++ b/openstack-console/src/main/java/com/woorea/openstack/console/utils/Table.java
@@ -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
index 0000000..f1ae84a
--- /dev/null
+++ b/openstack-console/src/main/java/com/woorea/openstack/console/utils/TableModel.java
@@ -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
index 0000000..01902e4
--- /dev/null
+++ b/openstack-console/src/main/resources/console.properties
@@ -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
index 0000000..9aee3b3
--- /dev/null
+++ b/openstack-examples/pom.xml
@@ -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
index 0000000..056eae5
--- /dev/null
+++ b/openstack-examples/src/main/java/com/woorea/openstack/examples/ExamplesConfiguration.java
@@ -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
index 0000000..643f14b
--- /dev/null
+++ b/openstack-examples/src/main/java/com/woorea/openstack/examples/compute/NovaCreateServer.java
@@ -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
index 0000000..893192d
--- /dev/null
+++ b/openstack-examples/src/main/java/com/woorea/openstack/examples/compute/NovaListFlavors.java
@@ -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
index 0000000..edf2f63
--- /dev/null
+++ b/openstack-examples/src/main/java/com/woorea/openstack/examples/compute/NovaListImages.java
@@ -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
index 0000000..cab24e1
--- /dev/null
+++ b/openstack-examples/src/main/java/com/woorea/openstack/examples/compute/NovaListServers.java
@@ -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
index 0000000..df4d44b
--- /dev/null
+++ b/openstack-examples/src/main/java/com/woorea/openstack/examples/compute/NovaStopStartServer.java
@@ -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
index 0000000..ea687aa
--- /dev/null
+++ b/openstack-examples/src/main/java/com/woorea/openstack/examples/glance/GlanceListImages.java
@@ -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
index 0000000..ee9fe44
--- /dev/null
+++ b/openstack-examples/src/main/java/com/woorea/openstack/examples/heat/HeatListStacks.java
@@ -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
index 0000000..5481a15
--- /dev/null
+++ b/openstack-examples/src/main/java/com/woorea/openstack/examples/hpcloud/Keystone3Authentication.java
@@ -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
index 0000000..1caffea
--- /dev/null
+++ b/openstack-examples/src/main/java/com/woorea/openstack/examples/hpcloud/KeystoneAuthentication.java
@@ -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
index 0000000..9bd3399
--- /dev/null
+++ b/openstack-examples/src/main/java/com/woorea/openstack/examples/keystone/KeystoneCreateTenant.java
@@ -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
index 0000000..bde2440
--- /dev/null
+++ b/openstack-examples/src/main/java/com/woorea/openstack/examples/keystone/KeystoneCreateUser.java
@@ -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
index 0000000..c9d0c18
--- /dev/null
+++ b/openstack-examples/src/main/java/com/woorea/openstack/examples/metering/v2/TestAll.java
@@ -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
index 0000000..8e218c2
--- /dev/null
+++ b/openstack-examples/src/main/java/com/woorea/openstack/examples/network/QuantumListNetworks.java
@@ -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
index 0000000..7f4dff0
--- /dev/null
+++ b/openstack-examples/src/main/java/com/woorea/openstack/examples/network/QuantumNetworkCreate.java
@@ -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
index 0000000..1a427ea
--- /dev/null
+++ b/openstack-examples/src/main/java/com/woorea/openstack/examples/network/QuantumQueryNetworks.java
@@ -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
index 0000000..089163c
--- /dev/null
+++ b/openstack-examples/src/main/java/com/woorea/openstack/examples/objectstore/SwiftExample.java
@@ -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
index 0000000..c2e8023
--- /dev/null
+++ b/openstack-examples/src/main/java/com/woorea/openstack/examples/simple/OpenStackSimpleClient.java
@@ -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
index 0000000..f2ad391
--- /dev/null
+++ b/openstack-java-sdk-master/.travis.yml
@@ -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
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
index 0000000..c5a82e3
--- /dev/null
+++ b/project-configs/maven/conf/settings.xml
@@ -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
index 0000000..1487637
--- /dev/null
+++ b/quantum-client/pom.xml
@@ -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
index 0000000..ec9c40f
--- /dev/null
+++ b/quantum-client/src/main/java/com/woorea/openstack/quantum/Quantum.java
@@ -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
index 0000000..97a919a
--- /dev/null
+++ b/quantum-client/src/main/java/com/woorea/openstack/quantum/api/NetworksResource.java
@@ -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
index 0000000..d14e860
--- /dev/null
+++ b/quantum-client/src/main/java/com/woorea/openstack/quantum/api/PortsResource.java
@@ -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
index 0000000..bcd646d
--- /dev/null
+++ b/quantum-client/src/main/java/com/woorea/openstack/quantum/api/RoutersResource.java
@@ -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
index 0000000..1864604
--- /dev/null
+++ b/quantum-client/src/main/java/com/woorea/openstack/quantum/api/SubnetsResource.java
@@ -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
index 0000000..8de5abf
--- /dev/null
+++ b/quantum-client/src/main/java/com/woorea/openstack/quantum/api/query/AbsOpenStackCmd.java
@@ -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
index 0000000..efed855
--- /dev/null
+++ b/quantum-model/pom.xml
@@ -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
index 0000000..2a7766f
--- /dev/null
+++ b/quantum-model/src/main/java/com/woorea/openstack/quantum/model/GatewayInfo.java
@@ -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
index 0000000..979add3
--- /dev/null
+++ b/quantum-model/src/main/java/com/woorea/openstack/quantum/model/HostRoute.java
@@ -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
index 0000000..f880619
--- /dev/null
+++ b/quantum-model/src/main/java/com/woorea/openstack/quantum/model/Network.java
@@ -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
index 0000000..507e39b
--- /dev/null
+++ b/quantum-model/src/main/java/com/woorea/openstack/quantum/model/NetworkForCreate.java
@@ -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
index 0000000..a4fd330
--- /dev/null
+++ b/quantum-model/src/main/java/com/woorea/openstack/quantum/model/Networks.java
@@ -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
index 0000000..3fbd390
--- /dev/null
+++ b/quantum-model/src/main/java/com/woorea/openstack/quantum/model/NeutronError.java
@@ -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
index 0000000..d25bafe
--- /dev/null
+++ b/quantum-model/src/main/java/com/woorea/openstack/quantum/model/Pool.java
@@ -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
index 0000000..8ca74f1
--- /dev/null
+++ b/quantum-model/src/main/java/com/woorea/openstack/quantum/model/Port.java
@@ -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
index 0000000..3c1af50
--- /dev/null
+++ b/quantum-model/src/main/java/com/woorea/openstack/quantum/model/PortForCreate.java
@@ -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
index 0000000..5f10d35
--- /dev/null
+++ b/quantum-model/src/main/java/com/woorea/openstack/quantum/model/Ports.java
@@ -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
index 0000000..a94afd5
--- /dev/null
+++ b/quantum-model/src/main/java/com/woorea/openstack/quantum/model/Router.java
@@ -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
index 0000000..62ec302
--- /dev/null
+++ b/quantum-model/src/main/java/com/woorea/openstack/quantum/model/RouterForAddInterface.java
@@ -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
index 0000000..b8c9291
--- /dev/null
+++ b/quantum-model/src/main/java/com/woorea/openstack/quantum/model/RouterForCreate.java
@@ -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
index 0000000..2d7551f
--- /dev/null
+++ b/quantum-model/src/main/java/com/woorea/openstack/quantum/model/RouterInterface.java
@@ -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
index 0000000..e2a56b2
--- /dev/null
+++ b/quantum-model/src/main/java/com/woorea/openstack/quantum/model/Routers.java
@@ -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
index 0000000..de78967
--- /dev/null
+++ b/quantum-model/src/main/java/com/woorea/openstack/quantum/model/Segment.java
@@ -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
index 0000000..7301514
--- /dev/null
+++ b/quantum-model/src/main/java/com/woorea/openstack/quantum/model/Subnet.java
@@ -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
index 0000000..2c07ab2
--- /dev/null
+++ b/quantum-model/src/main/java/com/woorea/openstack/quantum/model/SubnetForCreate.java
@@ -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
index 0000000..e9b21f4
--- /dev/null
+++ b/quantum-model/src/main/java/com/woorea/openstack/quantum/model/Subnets.java
@@ -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
index 0000000..b6255b9
--- /dev/null
+++ b/quantum-model/src/test/java/com/woorea/openstack/quantum/model/NetworkTest.java
@@ -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
index 0000000..bce5044
--- /dev/null
+++ b/quantum-model/src/test/java/com/woorea/openstack/quantum/model/PortTest.java
@@ -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
index 0000000..9136a38
--- /dev/null
+++ b/quantum-model/src/test/java/com/woorea/openstack/quantum/model/SubnetTest.java
@@ -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
index 0000000..b36f117
--- /dev/null
+++ b/swift-client/pom.xml
@@ -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
index 0000000..0629853
--- /dev/null
+++ b/swift-client/src/main/java/com/woorea/openstack/swift/Swift.java
@@ -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
index 0000000..f98fbf9
--- /dev/null
+++ b/swift-client/src/main/java/com/woorea/openstack/swift/api/AccountResource.java
@@ -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
index 0000000..c55babe
--- /dev/null
+++ b/swift-client/src/main/java/com/woorea/openstack/swift/api/ContainerResource.java
@@ -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
index 0000000..aedcc3f
--- /dev/null
+++ b/swift-client/src/main/java/com/woorea/openstack/swift/api/ContainersResource.java
@@ -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
index 0000000..4d8acb8
--- /dev/null
+++ b/swift-model/pom.xml
@@ -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
index 0000000..8b32ffa
--- /dev/null
+++ b/swift-model/src/main/java/com/woorea/openstack/swift/model/Account.java
@@ -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
index 0000000..62a002a
--- /dev/null
+++ b/swift-model/src/main/java/com/woorea/openstack/swift/model/Container.java
@@ -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
index 0000000..d53ee65
--- /dev/null
+++ b/swift-model/src/main/java/com/woorea/openstack/swift/model/Object.java
@@ -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
index 0000000..00f0ff8
--- /dev/null
+++ b/swift-model/src/main/java/com/woorea/openstack/swift/model/ObjectDownload.java
@@ -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
index 0000000..fd560b6
--- /dev/null
+++ b/swift-model/src/main/java/com/woorea/openstack/swift/model/ObjectForUpload.java
@@ -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
index 0000000..f44df45
--- /dev/null
+++ b/version.properties
@@ -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