From 99b2783a891741948d29fceb1f4e3a1607849d66 Mon Sep 17 00:00:00 2001 From: Jari Ojala Date: Sat, 22 Feb 2014 10:46:39 +0200 Subject: [PATCH 1/2] Added support for nova services -extension. --- .../java/com/woorea/openstack/nova/Nova.java | 7 + .../api/extensions/ServicesExtension.java | 60 ++++++++ .../woorea/openstack/nova/model/Service.java | 130 ++++++++++++++++++ .../woorea/openstack/nova/model/Services.java | 34 +++++ .../examples/compute/NovaListServices.java | 50 +++++++ 5 files changed, 281 insertions(+) create mode 100644 nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/ServicesExtension.java create mode 100644 nova-model/src/main/java/com/woorea/openstack/nova/model/Service.java create mode 100644 nova-model/src/main/java/com/woorea/openstack/nova/model/Services.java create mode 100644 openstack-examples/src/main/java/com/woorea/openstack/examples/compute/NovaListServices.java 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 index f81de7d44..2ad696224 100644 --- a/nova-client/src/main/java/com/woorea/openstack/nova/Nova.java +++ b/nova-client/src/main/java/com/woorea/openstack/nova/Nova.java @@ -15,6 +15,7 @@ import com.woorea.openstack.nova.api.extensions.SnapshotsExtension; import com.woorea.openstack.nova.api.extensions.VolumesExtension; import com.woorea.openstack.nova.api.extensions.HostsExtension; +import com.woorea.openstack.nova.api.extensions.ServicesExtension; public class Nova extends OpenStackClient { @@ -41,6 +42,8 @@ public class Nova extends OpenStackClient { private final QuotaSetsResource QUOTA_SETS; private final HostsExtension HOSTS; + + private final ServicesExtension SERVICES; public Nova(String endpoint, OpenStackClientConnector connector) { super(endpoint, connector); @@ -56,6 +59,7 @@ public Nova(String endpoint, OpenStackClientConnector connector) { AGGREGATES = new AggregatesExtension(this); QUOTA_SETS = new QuotaSetsResource(this); HOSTS = new HostsExtension(this); + SERVICES = new ServicesExtension(this); } public Nova(String endpoint) { @@ -110,4 +114,7 @@ public HostsExtension hosts() { return HOSTS; } + public ServicesExtension services() { + return SERVICES; + } } diff --git a/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/ServicesExtension.java b/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/ServicesExtension.java new file mode 100644 index 000000000..271a33e42 --- /dev/null +++ b/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/ServicesExtension.java @@ -0,0 +1,60 @@ +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.Service; +import com.woorea.openstack.nova.model.Services; + +public class ServicesExtension { + + private final OpenStackClient CLIENT; + + public ServicesExtension(OpenStackClient client) { + CLIENT = client; + } + + public List list(boolean details) { + return new List(details); + } + + public Enable enable(String host, String binary) { + return new Enable(host, binary); + } + + public Disable disable(String host, String binary) { + return new Disable(host, binary); + } + + public class List extends OpenStackRequest { + + public List(boolean detailed) { + super(CLIENT, HttpMethod.GET, + "/os-services" + (detailed ? "/detail" : ""), + null, Services.class); + } + + } + + public class Enable extends OpenStackRequest { + + public Enable(String host, String binary) { + super(CLIENT, HttpMethod.PUT, "/os-services/enable", + Entity.json("{\"host\":\"" + host + + "\", \"binary\":\"" + binary + "\"}"), + Service.class); + } + } + + public class Disable extends OpenStackRequest { + + public Disable(String host, String binary) { + super(CLIENT, HttpMethod.PUT, "/os-services/disable", + Entity.json("{\"host\":\"" + host + + "\", \"binary\":\"" + binary + "\"}"), + Service.class); + } + } +} diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/Service.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/Service.java new file mode 100644 index 000000000..bea3d9022 --- /dev/null +++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/Service.java @@ -0,0 +1,130 @@ +package com.woorea.openstack.nova.model; + +import java.io.Serializable; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.annotate.JsonRootName; + +@JsonRootName("service") +public class Service implements Serializable { + + private String binary; + + private String host; + + private String state; + + private String status; + + @JsonProperty("updated_at") + private String updatedAt; + + private String zone; + + @JsonProperty("disabled_reason") + private String disabledReason; + + public Service() { + } + + public Service(String binary, String host, String state, + String status, String updated_at, String zone, + String disabled_reason) { + this.binary = binary; + this.host = host; + this.state = state; + this.status = status; + this.updatedAt = updated_at; + this.zone = zone; + this.disabledReason = disabled_reason; + } + + /** + * @return the binary name of the service. + */ + public String getBinary() { + return binary; + } + + /** + * @return the host machine name + */ + public String getHost() { + return host; + } + + /** + * @return the stage + */ + public String getState() { + return state; + } + + /** + * @return the status (enabled/disabled) + */ + public String getStatus() { + return status; + } + + /** + * @return the last service meta-data update time + */ + public String getUpdatedAt() { + return updatedAt; + } + + /** + * @return the image + */ + public String getZone() { + return zone; + } + + /** + * @return reason for the disabling (if disabled). + */ + public String getDisabledReason() { + return disabledReason; + } + + public void setBinary(String binary) { + this.binary = binary; + } + + + public void setHost(String host) { + this.host = host; + } + + public void setState(String state) { + this.state = state; + } + + public void setStatus(String status) { + this.status = status; + } + + public void setUpdatedAt(String updatedAt) { + this.updatedAt = updatedAt; + } + + public void setZone(String zone) { + this.zone = zone; + } + + public void setDisabledReason(String disabledReason) { + this.disabledReason = disabledReason; + } + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "Service [binary=" + binary + ", host=" + host + + ", state=" + state + ", status=" + status + + ", updated_at=" + updatedAt + ", zone=" + zone + + ", disabled_reason=" + disabledReason + "]"; + } + +} diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/Services.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/Services.java new file mode 100644 index 000000000..00b253b5d --- /dev/null +++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/Services.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 Services implements Iterable, Serializable { + + @JsonProperty("services") + private List list; + + /** + * @return the list + */ + public List getList() { + return list; + } + + @Override + public Iterator iterator() { + return list.iterator(); + } + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "Services [list=" + list + "]"; + } + +} diff --git a/openstack-examples/src/main/java/com/woorea/openstack/examples/compute/NovaListServices.java b/openstack-examples/src/main/java/com/woorea/openstack/examples/compute/NovaListServices.java new file mode 100644 index 000000000..2de9942dd --- /dev/null +++ b/openstack-examples/src/main/java/com/woorea/openstack/examples/compute/NovaListServices.java @@ -0,0 +1,50 @@ +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.Service; +import com.woorea.openstack.nova.model.Services; + +public class NovaListServices { + + /** + * @param args + */ + public static void main(String[] args) { + Keystone keystone = new Keystone(/*"http://10.0.2.15:5000/v2.0"); */ExamplesConfiguration.KEYSTONE_AUTH_URL); + Access access = keystone.tokens().authenticate( + new UsernamePassword(/*"admin", */ExamplesConfiguration.KEYSTONE_USERNAME, + /*"nomoresecrete"))*/ExamplesConfiguration.KEYSTONE_PASSWORD)) + .withTenantName(/*"admin")*/"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(/*"http://10.0.2.15:8774/v2/" + access.getToken().getTenant().getId());*/ExamplesConfiguration.NOVA_ENDPOINT.concat("/").concat(access.getToken().getTenant().getId())); + novaClient.token(access.getToken().getId()); + //novaClient.enableLogging(Logger.getLogger("nova"), 100 * 1024); + + Services services = novaClient.services().list(false).execute(); + for(Service service : services) { + System.out.println(service); + + /* + if ("nova-compute".equals(service.getBinary())) { + final Service disabledService = novaClient.services().disable(service.getHost(), service.getBinary()).execute(); + System.out.println("Disabled: " + disabledService); + try { Thread.sleep(5000); } catch (final Exception ex) { } + final Service enabedService = novaClient.services().enable(service.getHost(), service.getBinary()).execute(); + System.out.println("Enabled: " + enabedService); + } + */ + } + + } + +} From 4b42acf71d5bf2a5e1d4b601ef8c125e676618be Mon Sep 17 00:00:00 2001 From: Jari Ojala Date: Mon, 17 Mar 2014 14:04:10 +0200 Subject: [PATCH 2/2] Added support to list tenant networks in nova (extension os-tenant-networks).. --- .../java/com/woorea/openstack/nova/Nova.java | 16 +++++++ .../extensions/TenantNetworksExtension.java | 29 ++++++++++++ .../openstack/nova/model/TenantNetwork.java | 46 +++++++++++++++++++ .../openstack/nova/model/TenantNetworks.java | 34 ++++++++++++++ .../compute/NovaListTenantNetworks.java | 40 ++++++++++++++++ 5 files changed, 165 insertions(+) create mode 100644 nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/TenantNetworksExtension.java create mode 100644 nova-model/src/main/java/com/woorea/openstack/nova/model/TenantNetwork.java create mode 100644 nova-model/src/main/java/com/woorea/openstack/nova/model/TenantNetworks.java create mode 100644 openstack-examples/src/main/java/com/woorea/openstack/examples/compute/NovaListTenantNetworks.java 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 index 2ad696224..688193bd9 100644 --- a/nova-client/src/main/java/com/woorea/openstack/nova/Nova.java +++ b/nova-client/src/main/java/com/woorea/openstack/nova/Nova.java @@ -15,7 +15,9 @@ import com.woorea.openstack.nova.api.extensions.SnapshotsExtension; import com.woorea.openstack.nova.api.extensions.VolumesExtension; import com.woorea.openstack.nova.api.extensions.HostsExtension; +import com.woorea.openstack.nova.api.extensions.NetworksExtension; import com.woorea.openstack.nova.api.extensions.ServicesExtension; +import com.woorea.openstack.nova.api.extensions.TenantNetworksExtension; public class Nova extends OpenStackClient { @@ -45,6 +47,10 @@ public class Nova extends OpenStackClient { private final ServicesExtension SERVICES; + private final NetworksExtension NETWORKS; + + private final TenantNetworksExtension TENANT_NETWORKS; + public Nova(String endpoint, OpenStackClientConnector connector) { super(endpoint, connector); EXTENSIONS = new ExtensionsResource(this); @@ -60,6 +66,8 @@ public Nova(String endpoint, OpenStackClientConnector connector) { QUOTA_SETS = new QuotaSetsResource(this); HOSTS = new HostsExtension(this); SERVICES = new ServicesExtension(this); + NETWORKS = new NetworksExtension(this); + TENANT_NETWORKS = new TenantNetworksExtension(this); } public Nova(String endpoint) { @@ -117,4 +125,12 @@ public HostsExtension hosts() { public ServicesExtension services() { return SERVICES; } + + public NetworksExtension networks() { + return NETWORKS; + } + + public TenantNetworksExtension tenantNetworks() { + return TENANT_NETWORKS; + } } diff --git a/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/TenantNetworksExtension.java b/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/TenantNetworksExtension.java new file mode 100644 index 000000000..dc8da17a9 --- /dev/null +++ b/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/TenantNetworksExtension.java @@ -0,0 +1,29 @@ +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.TenantNetworks; + +public class TenantNetworksExtension { + + private final OpenStackClient CLIENT; + + public TenantNetworksExtension(OpenStackClient client) { + CLIENT = client; + } + + public List list() { + return new List(); + } + + public class List extends OpenStackRequest { + + public List() { + super(CLIENT, HttpMethod.GET, "/os-tenant-networks", null, TenantNetworks.class); + } + + } + +} diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/TenantNetwork.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/TenantNetwork.java new file mode 100644 index 000000000..d8664b7d4 --- /dev/null +++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/TenantNetwork.java @@ -0,0 +1,46 @@ +package com.woorea.openstack.nova.model; + +import java.io.Serializable; + +import org.codehaus.jackson.map.annotate.JsonRootName; + +@JsonRootName("network") +public class TenantNetwork implements Serializable { + + private String id; + + private String cidr; + + private String label; + + /** + * @return the id + */ + public String getId() { + return id; + } + + /** + * @return the cidr + */ + public String getCidr() { + return cidr; + } + + /** + * @return the label + */ + public String getLabel() { + return label; + } + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "TenantNetwork [id=" + id + ", cidr=" + cidr + + ", label=" + label + "]"; + } + +} diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/TenantNetworks.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/TenantNetworks.java new file mode 100644 index 000000000..3fcf0b291 --- /dev/null +++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/TenantNetworks.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 TenantNetworks implements Iterable, Serializable { + + @JsonProperty("networks") + private List list; + + /** + * @return the list + */ + public List getList() { + return list; + } + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "TenantNetworks [list=" + list + "]"; + } + + @Override + public Iterator iterator() { + return list.iterator(); + } + +} diff --git a/openstack-examples/src/main/java/com/woorea/openstack/examples/compute/NovaListTenantNetworks.java b/openstack-examples/src/main/java/com/woorea/openstack/examples/compute/NovaListTenantNetworks.java new file mode 100644 index 000000000..e9c130c60 --- /dev/null +++ b/openstack-examples/src/main/java/com/woorea/openstack/examples/compute/NovaListTenantNetworks.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.model.TenantNetwork; +import com.woorea.openstack.nova.model.TenantNetworks; + +public class NovaListTenantNetworks { + + /** + * @param args + */ + public static void main(String[] args) { + Keystone keystone = new Keystone("http://10.0.2.15:5000/v2.0"); // */ExamplesConfiguration.KEYSTONE_AUTH_URL); + Access access = keystone.tokens().authenticate( + new UsernamePassword("admin", //*/ExamplesConfiguration.KEYSTONE_USERNAME, + "nomoresecrete"))//*/ExamplesConfiguration.KEYSTONE_PASSWORD)) + .withTenantName("admin")//*/"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("http://10.0.2.15:8774/v2/" + access.getToken().getTenant().getId());//*/ExamplesConfiguration.NOVA_ENDPOINT.concat("/").concat(access.getToken().getTenant().getId())); + novaClient.token(access.getToken().getId()); + //novaClient.enableLogging(Logger.getLogger("nova"), 100 * 1024); + + TenantNetworks networks = novaClient.tenantNetworks().list().execute(); + for (TenantNetwork network: networks) { + System.out.println(network); + } + + } + +}