[ 
https://issues.apache.org/jira/browse/JCLOUDS-655?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14090782#comment-14090782
 ] 

Andrew Ruef commented on JCLOUDS-655:
-------------------------------------

I created image by clicking "create snapshot" from a running instance in
 the instance list. What is strange is the output of glance image-list: 

$ glance image-list
+--------------------------------------+------------------+-------------+------------------+-----------+--------+
| ID                                   | Name             | Disk Format | 
Container Format | Size      | Status |
+--------------------------------------+------------------+-------------+------------------+-----------+--------+
| 224f4c31-052f-4e87-9f36-52c148358f60 | CentOS 6.5       | qcow2       | bare  
           | 344457216 | active |
| 7c35e28f-fee6-4f0a-a479-67ce8aa1e986 | Cirros 0.3.2     | qcow2       | bare  
           | 13167616  | active |
| cd9d57a9-0978-45f3-9cbc-edb99347be6b | t11              |             |       
           |           | active |
| cfefefc1-eba2-4b1e-9b07-a8c74a872d65 | Ubuntu LTS 14.04 | qcow2       | bare  
           | 254149120 | active |
+--------------------------------------+------------------+-------------+------------------+-----------+--------+

because the t11 image has no format or size, but I can still start an instance 
from it via the openstack web UI. 

Here are the logs from debug: 

{code}
>> initializing {id=openstack-nova, name=OpenStack Nova Diablo+ API, 
>> views=[org.jclouds.compute.ComputeServiceContext], endpointName=Keystone 
>> base url ending in /v2.0/, identityName=${tenantName}:${userName} or 
>> ${userName}, if your keystone supports a default tenant, 
>> credentialName=Optional.of(${password}), 
>> documentation=http://api.openstack.org/, api=interface 
>> org.jclouds.openstack.nova.v2_0.NovaApi}
>> adding node to group mygroup
-  >> searching params({minDisk=20.0, osFamily=ubuntu})
-  >> invoking AuthenticationApi.authenticateWithTenantNameAndCredentials
-  Sending request -576421320: POST https://<redacted>:5000/v2.0/tokens HTTP/1.1
-  >> 
"{"auth":{"passwordCredentials":{"username":"<redacted>","password":"<redacted>"},"tenantName":"<redacted>"}}"
-  >> POST https://stackadm00.umiacs.umd.edu:5000/v2.0/tokens HTTP/1.1
-  >> Accept: application/json
-  >> Content-Type: application/json
-  >> Content-Length: 96
-  Receiving response -576421320: HTTP/1.1 200 OK
-  << HTTP/1.1 200 OK
-  << Vary: X-Auth-Token,Accept-Encoding
-  << Date: Fri, 08 Aug 2014 13:58:27 GMT
-  << Connection: close
-  << Server: Apache/2.2.15 (Red Hat)
-  << Content-Type: application/json
-  << Content-Length: 8625
-  << "{"access": {"token": {"issued_at": "2014-08-08T13:58:27.350697", 
"expires": "2014-08-08T14:58:27Z", "id": "<redacted>", "tenant": 
{"description": "<redacted>", "enabled": true, "id": 
"d312a9d1acee46499e04fc2c0cd7e540", "name": "<redacted>"}}, "serviceCatalog": 
[{"endpoints": [{"adminURL": 
"http://192.168.24.16:8774/v2/d312a9d1acee46499e04fc2c0cd7e540";, "region": 
"RegionOne", "internalURL": 
"http://192.168.24.16:8774/v2/d312a9d1acee46499e04fc2c0cd7e540";, "id": 
"266bcf89093544c584b21ef7152e8a60", "publicURL": 
"http://192.168.24.16:8774/v2/d312a9d1acee46499e04fc2c0cd7e540"}], 
"endpoints_links": [], "type": "compute", "name": "nova"}, {"endpoints": 
[{"adminURL": "http://192.168.24.16:9696/";, "region": "RegionOne", 
"internalURL": "http://192.168.24.16:9696/";, "id": 
"34a3b8ec6c0845268811939ae00126d8", "publicURL": 
"http://192.168.24.16:9696/"}], "endpoints_links": [], "type": "network", 
"name": "neutron"}, {"endpoints": [{"adminURL": 
"http://192.168.24.16:8776/v2/d312a9d1acee46499e04fc2c0cd7e540";, "region": 
"RegionOne", "internalURL": 
"http://192.168.24.16:8776/v2/d312a9d1acee46499e04fc2c0cd7e540";, "id": 
"175f8094d5b94c3d99cc2a088119fdac", "publicURL": 
"http://192.168.24.16:8776/v2/d312a9d1acee46499e04fc2c0cd7e540"}], 
"endpoints_links": [], "type": "volumev2", "name": "cinder_v2"}, {"endpoints": 
[{"adminURL": "http://192.168.24.16:9292";, "region": "RegionOne", 
"internalURL": "http://192.168.24.16:9292";, "id": 
"0247e4da002646d9ac3be546022e54ae", "publicURL": "http://192.168.24.16:9292"}], 
"endpoints_links": [], "type": "image", "name": "glance"}, {"endpoints": 
[{"adminURL": "http://192.168.24.16:8777";, "region": "RegionOne", 
"internalURL": "http://192.168.24.16:8777";, "id": 
"30e427c6f1b44acaab370dc6a8d5fb67", "publicURL": "http://192.168.24.16:8777"}], 
"endpoints_links": [], "type": "metering", "name": "ceilometer"}, {"endpoints": 
[{"adminURL": "http://192.168.24.16:8776/v1/d312a9d1acee46499e04fc2c0cd7e540";, 
"region": "RegionOne", "internalURL": 
"http://192.168.24.16:8776/v1/d312a9d1acee46499e04fc2c0cd7e540";, "id": 
"6a11da4559cb4ed6b53fed828a8c5ab0", "publicURL": 
"http://192.168.24.16:8776/v1/d312a9d1acee46499e04fc2c0cd7e540"}], 
"endpoints_links": [], "type": "volume", "name": "cinder"}, {"endpoints": 
[{"adminURL": "http://192.168.24.16:8773/services/Admin";, "region": 
"RegionOne", "internalURL": "http://192.168.24.16:8773/services/Cloud";, "id": 
"4a32e2cec4154aa6a7f9679df8d4243a", "publicURL": 
"http://192.168.24.16:8773/services/Cloud"}], "endpoints_links": [], "type": 
"ec2", "name": "nova_ec2"}, {"endpoints": [{"adminURL": 
"http://192.168.24.16:8004/v1/d312a9d1acee46499e04fc2c0cd7e540";, "region": 
"RegionOne", "internalURL": 
"http://192.168.24.16:8004/v1/d312a9d1acee46499e04fc2c0cd7e540";, "id": 
"42d54eeabf29462da7ac7c9d5b8a198f", "publicURL": 
"http://192.168.24.16:8004/v1/d312a9d1acee46499e04fc2c0cd7e540"}], 
"endpoints_links": [], "type": "orchestration", "name": "heat"}, {"endpoints": 
[{"adminURL": "https://stackadm00.umiacs.umd.edu:35357/v2.0";, "region": 
"regionOne", "internalURL": "https://stackadm00.umiacs.umd.edu:5000/v2.0";, 
"id": "496bbf5f41a746e092e5621ac1e92363", "publicURL": 
"https://stackadm00.umiacs.umd.edu:5000/v2.0"}], "endpoints_links": [], "type": 
"identity", "name": "keystone"}], "user": {"username": "awruef", "roles_links": 
[], "id": "awruef", "roles": [{"name": "_member_"}], "name": "awruef"}, 
"metadata": {"is_admin": 0, "roles": ["9fe2ff9ee4384b1894a90878d3e92bab"]}}}"
-  endpoints for apiType compute and version 2: 
{RegionOne=[Endpoint{id=266bcf89093544c584b21ef7152e8a60, region=RegionOne, 
publicURL=http://192.168.24.16:8774/v2/d312a9d1acee46499e04fc2c0cd7e540, 
internalURL=http://192.168.24.16:8774/v2/d312a9d1acee46499e04fc2c0cd7e540, 
adminURL=http://192.168.24.16:8774/v2/d312a9d1acee46499e04fc2c0cd7e540}]}
-  no jclouds.zones configured for provider openstack-nova
-  no jclouds.zones configured for provider openstack-nova
-  >> invoking image:list
-  Sending request 510492042: GET 
http://192.168.24.16:8774/v2/d312a9d1acee46499e04fc2c0cd7e540/images/detail 
HTTP/1.1
-  >> GET 
http://192.168.24.16:8774/v2/d312a9d1acee46499e04fc2c0cd7e540/images/detail 
HTTP/1.1
-  >> Accept: application/json
-  >> X-Auth-Token: <redacted>
-  Receiving response 510492042: HTTP/1.1 200 OK
-  << HTTP/1.1 200 OK
-  << Date: Fri, 08 Aug 2014 13:58:28 GMT
-  << Connection: keep-alive
-  << X-Compute-Request-Id: req-8a117f97-18ab-4323-841e-60ce4b029028
-  << Content-Type: application/json
-  << Content-Length: 3474
-  << "{"images": [{"status": "ACTIVE", "updated": "2014-08-08T04:43:36Z", 
"links": [{"href": 
"http://192.168.24.16:8774/v2/d312a9d1acee46499e04fc2c0cd7e540/images/cd9d57a9-0978-45f3-9cbc-edb99347be6b";,
 "rel": "self"}, {"href": 
"http://192.168.24.16:8774/d312a9d1acee46499e04fc2c0cd7e540/images/cd9d57a9-0978-45f3-9cbc-edb99347be6b";,
 "rel": "bookmark"}, {"href": 
"http://192.168.24.16:9292/d312a9d1acee46499e04fc2c0cd7e540/images/cd9d57a9-0978-45f3-9cbc-edb99347be6b";,
 "type": "application/vnd.openstack.image", "rel": "alternate"}], "id": 
"cd9d57a9-0978-45f3-9cbc-edb99347be6b", "OS-EXT-IMG-SIZE:size": 0, "name": 
"t11", "created": "2014-08-08T04:43:36Z", "minDisk": 0, "progress": 100, 
"minRam": 0, "metadata": {"block_device_mapping": [{"guest_format": null, 
"boot_index": 0, "no_device": null, "volume_id": null, "volume_size": null, 
"disk_bus": null, "image_id": null, "source_type": "snapshot", "device_type": 
null, "snapshot_id": "a900a56c-61b7-4438-9150-76312fa1aa10", 
"destination_type": "volume", "delete_on_termination": null}], "checksum": 
"32c08d302f9206668030d47789b77858", "min_ram": "1", "disk_format": "qcow2", 
"image_name": "Ubuntu LTS 14.04", "bdm_v2": "True", "image_id": 
"cfefefc1-eba2-4b1e-9b07-a8c74a872d65", "root_device_name": "/dev/vda", 
"container_format": "bare", "min_disk": "8", "size": "254149120"}}, {"status": 
"ACTIVE", "updated": "2014-06-25T13:46:44Z", "links": [{"href": 
"http://192.168.24.16:8774/v2/d312a9d1acee46499e04fc2c0cd7e540/images/224f4c31-052f-4e87-9f36-52c148358f60";,
 "rel": "self"}, {"href": 
"http://192.168.24.16:8774/d312a9d1acee46499e04fc2c0cd7e540/images/224f4c31-052f-4e87-9f36-52c148358f60";,
 "rel": "bookmark"}, {"href": 
"http://192.168.24.16:9292/d312a9d1acee46499e04fc2c0cd7e540/images/224f4c31-052f-4e87-9f36-52c148358f60";,
 "type": "application/vnd.openstack.image", "rel": "alternate"}], "id": 
"224f4c31-052f-4e87-9f36-52c148358f60", "OS-EXT-IMG-SIZE:size": 344457216, 
"name": "CentOS 6.5", "created": "2014-06-25T13:45:19Z", "minDisk": 8, 
"progress": 100, "minRam": 1, "metadata": {}}, {"status": "ACTIVE", "updated": 
"2014-06-25T13:41:29Z", "links": [{"href": 
"http://192.168.24.16:8774/v2/d312a9d1acee46499e04fc2c0cd7e540/images/7c35e28f-fee6-4f0a-a479-67ce8aa1e986";,
 "rel": "self"}, {"href": 
"http://192.168.24.16:8774/d312a9d1acee46499e04fc2c0cd7e540/images/7c35e28f-fee6-4f0a-a479-67ce8aa1e986";,
 "rel": "bookmark"}, {"href": 
"http://192.168.24.16:9292/d312a9d1acee46499e04fc2c0cd7e540/images/7c35e28f-fee6-4f0a-a479-67ce8aa1e986";,
 "type": "application/vnd.openstack.image", "rel": "alternate"}], "id": 
"7c35e28f-fee6-4f0a-a479-67ce8aa1e986", "OS-EXT-IMG-SIZE:size": 13167616, 
"name": "Cirros 0.3.2", "created": "2014-06-25T13:41:25Z", "minDisk": 1, 
"progress": 100, "minRam": 1, "metadata": {}}, {"status": "ACTIVE", "updated": 
"2014-06-25T13:38:57Z", "links": [{"href": 
"http://192.168.24.16:8774/v2/d312a9d1acee46499e04fc2c0cd7e540/images/cfefefc1-eba2-4b1e-9b07-a8c74a872d65";,
 "rel": "self"}, {"href": 
"http://192.168.24.16:8774/d312a9d1acee46499e04fc2c0cd7e540/images/cfefefc1-eba2-4b1e-9b07-a8c74a872d65";,
 "rel": "bookmark"}, {"href": 
"http://192.168.24.16:9292/d312a9d1acee46499e04fc2c0cd7e540/images/cfefefc1-eba2-4b1e-9b07-a8c74a872d65";,
 "type": "application/vnd.openstack.image", "rel": "alternate"}], "id": 
"cfefefc1-eba2-4b1e-9b07-a8c74a872d65", "OS-EXT-IMG-SIZE:size": 254149120, 
"name": "Ubuntu LTS 14.04", "created": "2014-06-25T13:38:28Z", "minDisk": 8, 
"progress": 100, "minRam": 1, "metadata": {}}]}"
-  Error parsing input
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected 
a string but was BEGIN_ARRAY at line 1 column 733
  at 
org.jclouds.json.internal.DeserializationConstructorAndReflectiveTypeAdapterFactory$DeserializeIntoParameterizedConstructor.read(DeserializationConstructorAndReflectiveTypeAdapterFactory.java:178)
 ~[compute-basics-jar-with-dependencies.jar:na]
  at 
org.jclouds.json.internal.NullFilteringTypeAdapterFactories$IterableTypeAdapter.readAndBuild(NullFilteringTypeAdapterFactories.java:90)
 ~[compute-basics-jar-with-dependencies.jar:na]
  at 
org.jclouds.json.internal.NullFilteringTypeAdapterFactories$IterableTypeAdapter.read(NullFilteringTypeAdapterFactories.java:82)
 ~[compute-basics-jar-with-dependencies.jar:na]
  at 
org.jclouds.json.internal.NullFilteringTypeAdapterFactories$IterableTypeAdapter.read(NullFilteringTypeAdapterFactories.java:61)
 ~[compute-basics-jar-with-dependencies.jar:na]
  at 
org.jclouds.json.internal.DeserializationConstructorAndReflectiveTypeAdapterFactory$ParameterReader.read(DeserializationConstructorAndReflectiveTypeAdapterFactory.java:260)
 ~[compute-basics-jar-with-dependencies.jar:na]
  at 
org.jclouds.json.internal.DeserializationConstructorAndReflectiveTypeAdapterFactory$DeserializeIntoParameterizedConstructor.read(DeserializationConstructorAndReflectiveTypeAdapterFactory.java:172)
 ~[compute-basics-jar-with-dependencies.jar:na]
  at com.google.gson.Gson.fromJson(Gson.java:803) 
~[compute-basics-jar-with-dependencies.jar:na]
  at com.google.gson.Gson.fromJson(Gson.java:768) 
~[compute-basics-jar-with-dependencies.jar:na]
  at com.google.gson.Gson.fromJson(Gson.java:717) 
~[compute-basics-jar-with-dependencies.jar:na]
  at org.jclouds.json.internal.GsonWrapper.fromJson(GsonWrapper.java:42) 
~[compute-basics-jar-with-dependencies.jar:na]
  at org.jclouds.http.functions.ParseJson.apply(ParseJson.java:82) 
[compute-basics-jar-with-dependencies.jar:na]
  at org.jclouds.http.functions.ParseJson.apply(ParseJson.java:76) 
[compute-basics-jar-with-dependencies.jar:na]
  at org.jclouds.http.functions.ParseJson.apply(ParseJson.java:62) 
[compute-basics-jar-with-dependencies.jar:na]
  at org.jclouds.http.functions.ParseJson.apply(ParseJson.java:42) 
[compute-basics-jar-with-dependencies.jar:na]
  at 
com.google.common.base.Functions$FunctionComposition.apply(Functions.java:216) 
[compute-basics-jar-with-dependencies.jar:na]
  at 
org.jclouds.rest.internal.InvokeHttpMethod.invoke(InvokeHttpMethod.java:90) 
[compute-basics-jar-with-dependencies.jar:na]
  at org.jclouds.rest.internal.InvokeHttpMethod.apply(InvokeHttpMethod.java:73) 
[compute-basics-jar-with-dependencies.jar:na]
  at org.jclouds.rest.internal.InvokeHttpMethod.apply(InvokeHttpMethod.java:44) 
[compute-basics-jar-with-dependencies.jar:na]
  at 
org.jclouds.reflect.FunctionalReflection$FunctionalInvocationHandler.handleInvocation(FunctionalReflection.java:117)
 [compute-basics-jar-with-dependencies.jar:na]
  at 
com.google.common.reflect.AbstractInvocationHandler.invoke(AbstractInvocationHandler.java:87)
 [compute-basics-jar-with-dependencies.jar:na]
  at com.sun.proxy.$Proxy67.listInDetail(Unknown Source) [na:na]
  at 
org.jclouds.openstack.nova.v2_0.compute.NovaComputeServiceAdapter.listImages(NovaComputeServiceAdapter.java:168)
 [compute-basics-jar-with-dependencies.jar:na]
  at 
org.jclouds.compute.config.ComputeServiceAdapterContextModule$2.get(ComputeServiceAdapterContextModule.java:121)
 [compute-basics-jar-with-dependencies.jar:na]
  at 
org.jclouds.compute.config.ComputeServiceAdapterContextModule$2.get(ComputeServiceAdapterContextModule.java:118)
 [compute-basics-jar-with-dependencies.jar:na]
  at 
org.jclouds.rest.suppliers.MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier$SetAndThrowAuthorizationExceptionSupplierBackedLoader.load(MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier.java:73)
 [compute-basics-jar-with-dependencies.jar:na
at 
org.jclouds.rest.suppliers.MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier$SetAndThrowAuthorizationExceptionSupplierBackedLoader.load(MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier.java:57)
 [compute-basics-jar-with-dependencies.jar:na]
  at 
com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3524)
 [compute-basics-jar-with-dependencies.jar:na]
  at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2317) 
[compute-basics-jar-with-dependencies.jar:na]
  at 
com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2280)
 [compute-basics-jar-with-dependencies.jar:na]
  at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2195) 
[compute-basics-jar-with-dependencies.jar:na]
  at com.google.common.cache.LocalCache.get(LocalCache.java:3934) 
[compute-basics-jar-with-dependencies.jar:na]
  at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3938) 
[compute-basics-jar-with-dependencies.jar:na]
  at 
com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4821) 
[compute-basics-jar-with-dependencies.jar:na]
  at 
org.jclouds.rest.suppliers.MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier.get(MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier.java:119)
 [compute-basics-jar-with-dependencies.jar:na]
  at 
org.jclouds.compute.suppliers.ImageCacheSupplier.get(ImageCacheSupplier.java:64)
 [compute-basics-jar-with-dependencies.jar:na]
  at 
org.jclouds.compute.domain.internal.TemplateBuilderImpl.getImages(TemplateBuilderImpl.java:881)
 [compute-basics-jar-with-dependencies.jar:na]
  at 
org.jclouds.compute.domain.internal.TemplateBuilderImpl.build(TemplateBuilderImpl.java:681)
 [compute-basics-jar-with-dependencies.jar:na]
  at edu.umd.umiacs.openstack.examples.MainApp.main(MainApp.java:177) 
[compute-basics-jar-with-dependencies.jar:na]
Caused by: java.lang.IllegalStateException: Expected a string but was 
BEGIN_ARRAY at line 1 column 733
  at com.google.gson.stream.JsonReader.nextString(JsonReader.java:821) 
~[compute-basics-jar-with-dependencies.jar:na]
  at com.google.gson.internal.bind.TypeAdapters$13.read(TypeAdapters.java:358) 
~[compute-basics-jar-with-dependencies.jar:na]
  at com.google.gson.internal.bind.TypeAdapters$13.read(TypeAdapters.java:346) 
~[compute-basics-jar-with-dependencies.jar:na]
  at 
org.jclouds.json.internal.NullFilteringTypeAdapterFactories$MapTypeAdapter.read(NullFilteringTypeAdapterFactories.java:311)
 ~[compute-basics-jar-with-dependencies.jar:na]
  at 
org.jclouds.json.internal.NullFilteringTypeAdapterFactories$MapTypeAdapter.read(NullFilteringTypeAdapterFactories.java:281)
 ~[compute-basics-jar-with-dependencies.jar:na]
  at 
org.jclouds.json.internal.DeserializationConstructorAndReflectiveTypeAdapterFactory$ParameterReader.read(DeserializationConstructorAndReflectiveTypeAdapterFactory.java:260)
 ~[compute-basics-jar-with-dependencies.jar:na]
  at 
org.jclouds.json.internal.DeserializationConstructorAndReflectiveTypeAdapterFactory$DeserializeIntoParameterizedConstructor.read(DeserializationConstructorAndReflectiveTypeAdapterFactory.java:172)
 ~[compute-basics-jar-with-dependencies.jar:na]
  ... 37 common frames omitted
{code}

Here is the code: 

{code}
package edu.umd.umiacs.openstack.examples;
import static com.google.common.base.Charsets.UTF_8;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Predicates.not;
import static com.google.common.collect.Iterables.concat;
import static com.google.common.collect.Iterables.contains;
import static com.google.common.collect.Iterables.getOnlyElement;
import static org.jclouds.scriptbuilder.domain.Statements.createOrOverwriteFile;
import static org.jclouds.scriptbuilder.domain.Statements.rm;
import static 
org.jclouds.openstack.nova.v2_0.compute.options.NovaTemplateOptions.Builder.blockUntilRunning;
import static 
org.jclouds.openstack.nova.v2_0.compute.options.NovaTemplateOptions.Builder.keyPairName;
import static 
org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_SCRIPT_COMPLETE;
import static org.jclouds.compute.options.RunScriptOptions.Builder.runAsRoot;
import static 
org.jclouds.compute.options.TemplateOptions.Builder.overrideLoginCredentials;
import static 
org.jclouds.compute.options.TemplateOptions.Builder.overrideLoginUser;
import static org.jclouds.compute.options.TemplateOptions.Builder.runScript;
import static org.jclouds.compute.predicates.NodePredicates.TERMINATED;
import static org.jclouds.compute.predicates.NodePredicates.inGroup;
import static org.jclouds.scriptbuilder.domain.Statements.exec;
import static org.jclouds.scriptbuilder.domain.Statements.newStatementList;

import java.io.File;
import java.io.IOException;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.ArrayList;
import java.util.Set;
import java.util.NoSuchElementException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.ExecutionException;

import org.jclouds.ContextBuilder;
import org.jclouds.apis.ApiMetadata;
import org.jclouds.apis.Apis;
import org.jclouds.compute.ComputeService;
import org.jclouds.compute.ComputeServiceContext;
import org.jclouds.compute.RunNodesException;
import org.jclouds.compute.RunScriptOnNodesException;
import org.jclouds.compute.domain.ExecResponse;
import org.jclouds.compute.domain.NodeMetadata;
import org.jclouds.compute.domain.TemplateBuilder;
import org.jclouds.domain.LoginCredentials;
import org.jclouds.enterprise.config.EnterpriseConfigurationModule;
import org.jclouds.logging.slf4j.config.SLF4JLoggingModule;
import org.jclouds.providers.ProviderMetadata;
import org.jclouds.providers.Providers;
import org.jclouds.scriptbuilder.domain.Statement;
import org.jclouds.scriptbuilder.statements.login.AdminAccess;
import org.jclouds.ssh.jsch.config.JschSshClientModule;
import org.jclouds.ssh.SshClient;
import org.jclouds.io.Payloads;

import com.google.common.base.Charsets;
import com.google.common.base.Predicates;
import com.google.common.collect.ImmutableSet;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.collect.Iterables;
import com.google.common.collect.Maps;
import com.google.common.io.Files;
import com.google.inject.Module;

import org.jclouds.compute.domain.Image;
import org.jclouds.compute.domain.ComputeMetadata;
import org.jclouds.compute.domain.OsFamily;

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.io.FileUtils;

public class MainApp {
   public static final Map<String, ApiMetadata> allApis = 
Maps.uniqueIndex(Apis.viewableAs(ComputeServiceContext.class),
        Apis.idFunction());
   
   public static final Map<String, ProviderMetadata> appProviders = 
Maps.uniqueIndex(Providers.viewableAs(ComputeServiceContext.class),
        Providers.idFunction());
   
   public static final Set<String> allKeys = 
ImmutableSet.copyOf(Iterables.concat(appProviders.keySet(), allApis.keySet()));
   
   public static int PARAMETERS = 4;
   public static String INVALID_SYNTAX = "Invalid number of parameters. Syntax 
is: provider identity credential groupName";
  
  private static void uploadResource(ComputeService compute, NodeMetadata node, 
byte[] data, String fileName) {
    //base64 encode 'data'
    String             b64data = Base64.encodeBase64String(data);
    ArrayList<String>  tmp = new ArrayList<String>();
    
    tmp.add(b64data);
    
    System.out.println("Uploading");
    //upload it using the createOrOverwriteFile Statement
    Statement    upload = createOrOverwriteFile("/tmp/upld", tmp);
    
    System.out.println("Decoding");
    //use base64 to recreate the file on the far end
    Statement  decode = exec("base64 -d /tmp/upld > "+fileName);
    
    System.out.println("Removing");
    Statement stmts = newStatementList(upload, decode, rm("/tmp/upld"));

    ExecResponse resp = compute.runScriptOnNode(node.getId(), stmts);
   
    System.out.println("Done");
    return;
  }

  public static void main(String[] args) {
    if (args.length < PARAMETERS) {
      throw new IllegalArgumentException(INVALID_SYNTAX);
    }

    String provider = args[0];
    String identity = args[1];
    String credential = args[2];
    String groupName = args[3];

    checkArgument(contains(allKeys, provider), "provider %s not in supported 
list: %s", provider, allKeys);

    LoginCredentials  login = getLogin();
    ComputeService    compute = initComputeService(provider, identity, 
credential);
    NodeMetadata      node = null;

    try {
      System.out.printf(">> adding node to group %s%n", groupName);
      
      // Default template chooses the smallest size on an operating system
      // that tested to work with java, which tends to be Ubuntu or CentOS
      TemplateBuilder templateBuilder = compute.templateBuilder();

      // note this will create a user with the same name as you on the
      // node. ex. you can connect via ssh publicip
      Statement bootInstructions = AdminAccess.standard();

      // to run commands as root, we use the runScript option in the template.
      templateBuilder.options(runScript(bootInstructions));
      templateBuilder.osFamily(OsFamily.UBUNTU);
      //templateBuilder.imageId("760153eb-75bf-4c14-94e6-cce36562ab45");

      templateBuilder.minDisk(20);

      //add openstack-specific options to set ssh key used in image
      
templateBuilder.options(keyPairName("dev").blockUntilRunning(true).overrideLoginCredentials(login));

      //build the node
      node = getOnlyElement(compute.createNodesInGroup(groupName, 1, 
templateBuilder.build()));

      System.out.printf("<< node %s: %s%n", node.getId(),
            concat(node.getPrivateAddresses(), node.getPublicAddresses()));
     
    } catch (RunNodesException e) {
      System.err.println("<< error adding node to group " + groupName + ": " + 
e.getMessage());
    }     
    
    ListenableFuture<ExecResponse>  r = null;

    try {
      if(node != null) {
        System.out.printf(">> Submitting script to run %n");
        Statement helloStmt = exec("echo hello");
        r = compute.submitScriptOnNode(node.getId(), helloStmt, 
runAsRoot(false).overrideLoginCredentials(login));
        System.out.printf(">> Submitted script%n");
      }
    } catch (NoSuchElementException e) {
      System.err.printf("<< submit NoSuchElementException%n");
    } catch (IllegalStateException e) {
      System.err.printf("<< submit IllegalStateException%n");
    }

    try {
      if(r != null) {
        System.out.printf("<< Getting response%n");
        ExecResponse  resp = r.get();
        System.out.printf("<< response == %s%n", resp.getOutput());
      }
    } catch (InterruptedException e) {
      System.err.printf("<< r.get() interrupted%n");
    } catch (ExecutionException e) {
      System.err.printf("<< r.get() execution exception%n");
    }

    //uploading new program and running it
    try {
      if(node != null) {
        File  f = new File("foo.py");
        System.out.printf("Ssh put foo.py%n");
        byte[]  bytes = null;
        try {
          bytes = FileUtils.readFileToByteArray(f);
        } catch (IOException e1) {
          System.out.printf("Could not read file%n");
        }

        if(bytes != null) {
          uploadResource(compute, node, bytes, "/home/ubuntu/foo.py");
          System.out.printf("Put foo.py on host%n");

          /*SshClient client = 
compute.getContext().utils().sshForNode().apply(node);
          client.put("/home/ubuntu/foo.py", Payloads.newFilePayload(new 
File("foo.py")));*/
          
          System.out.printf("Running foo.py on host%n");
          
          Statement execStmt = exec("python /home/ubuntu/foo.py");
          r = compute.submitScriptOnNode(node.getId(), execStmt, 
runAsRoot(false).overrideLoginCredentials(login));
          ExecResponse resp = r.get();
          System.out.printf("Got response %s%n", resp.getOutput());
        }
      }
    } catch (InterruptedException e) {
    } catch (ExecutionException e) {
    }

    if(node != null) {
      System.out.printf(">> Destroying node %s%n", node.getId());
      compute.destroyNode(node.getId());
      System.out.printf("<< Node destroyed%n");
    }

    System.out.printf("<< All done%n");

    compute.getContext().close();

    System.out.printf("<< Context closed %n");

    return;
  }

  private static ComputeService initComputeService(String provider, String 
identity, String credential) {

     Properties properties = new Properties();
     long scriptTimeout = TimeUnit.MILLISECONDS.convert(20, TimeUnit.MINUTES);
     properties.setProperty(TIMEOUT_SCRIPT_COMPLETE, scriptTimeout + "");

     // example of injecting a ssh implementation
     Iterable<Module> modules = ImmutableSet.<Module> of(
           new JschSshClientModule(),
           new SLF4JLoggingModule(),
           new EnterpriseConfigurationModule());

     ContextBuilder builder = ContextBuilder.newBuilder(provider)
                                            .credentials(identity, credential)
                                            .modules(modules)
                                            .overrides(properties);
                                            
     System.out.printf(">> initializing %s%n", builder.getApiMetadata());

     return builder.buildView(ComputeServiceContext.class).getComputeService();
  }

  private static LoginCredentials getLogin() {
     try {
       String user = System.getProperty("user.name");
       String privateKey = Files.toString(
           new File(System.getProperty("user.home") + "/.ssh/id_rsa"), UTF_8);
       return LoginCredentials.builder().
           user(user).privateKey(privateKey).build();
     } catch (Exception e) {
        System.err.println("error reading ssh key " + e.getMessage());
        System.exit(1);
        return null;
     }
  }

}
{code}

> com.google.gson.JsonSyntaxException on trying to start a new instance with 
> openstack
> ------------------------------------------------------------------------------------
>
>                 Key: JCLOUDS-655
>                 URL: https://issues.apache.org/jira/browse/JCLOUDS-655
>             Project: jclouds
>          Issue Type: Bug
>          Components: jclouds-compute
>    Affects Versions: 1.8.0
>         Environment: Openstack Havana, linux
>            Reporter: Andrew Ruef
>
> this seems very similar to [JCLOUDS-558]:
> {code}
> "{"images": [{"status": "ACTIVE", "updated": "2014-08-08T04:43:36Z", "links": 
> [{"href": 
> "http://192.168.24.16:8774/v2/d312a9d1acee46499e04fc2c0cd7e540/images/cd9d57a9-0978-45f3-9cbc-edb99347be6b";,
>  "rel": "self"}, {"href": 
> "http://192.168.24.16:8774/d312a9d1acee46499e04fc2c0cd7e540/images/cd9d57a9-0978-45f3-9cbc-edb99347be6b";,
>  "rel": "bookmark"}, {"href": 
> "http://192.168.24.16:9292/d312a9d1acee46499e04fc2c0cd7e540/images/cd9d57a9-0978-45f3-9cbc-edb99347be6b";,
>  "type": "application/vnd.openstack.image", "rel": "alternate"}], "id": 
> "cd9d57a9-0978-45f3-9cbc-edb99347be6b", "OS-EXT-IMG-SIZE:size": 0, "name": 
> "t11", "created": "2014-08-08T04:43:36Z", "minDisk": 0, "progress": 100, 
> "minRam": 0, "metadata": {"block_device_mapping": [{"guest_format": null, 
> "boot_index": 0, "no_device": null, "volume_id": null, "volume_size": null, 
> "disk_bus": null, "image_id": null, "source_type": "snapshot", "device_type": 
> null, "snapshot_id": "a900a56c-61b7-4438-9150-76312fa1aa10", 
> "destination_type": "volume", "delete_on_termination": null}], "checksum": 
> "32c08d302f9206668030d47789b77858", "min_ram": "1", "disk_format": "qcow2", 
> "image_name": "Ubuntu LTS 14.04", "bdm_v2": "True", "image_id": 
> "cfefefc1-eba2-4b1e-9b07-a8c74a872d65", "root_device_name": "/dev/vda", 
> "container_format": "bare", "min_disk": "8", "size": "254149120"}}, 
> {"status": "ACTIVE", "updated": "2014-06-25T13:46:44Z", "links": [{"href": 
> "http://192.168.24.16:8774/v2/d312a9d1acee46499e04fc2c0cd7e540/images/224f4c31-052f-4e87-9f36-52c148358f60";,
>  "rel": "self"}, {"href": 
> "http://192.168.24.16:8774/d312a9d1acee46499e04fc2c0cd7e540/images/224f4c31-052f-4e87-9f36-52c148358f60";,
>  "rel": "bookmark"}, {"href": 
> "http://192.168.24.16:9292/d312a9d1acee46499e04fc2c0cd7e540/images/224f4c31-052f-4e87-9f36-52c148358f60";,
>  "type": "application/vnd.openstack.image", "rel": "alternate"}], "id": 
> "224f4c31-052f-4e87-9f36-52c148358f60", "OS-EXT-IMG-SIZE:size": 344457216, 
> "name": "CentOS 6.5", "created": "2014-06-25T13:45:19Z", "minDisk": 8, 
> "progress": 100, "minRam": 1, "metadata": {}}, {"status": "ACTIVE", 
> "updated": "2014-06-25T13:41:29Z", "links": [{"href": 
> "http://192.168.24.16:8774/v2/d312a9d1acee46499e04fc2c0cd7e540/images/7c35e28f-fee6-4f0a-a479-67ce8aa1e986";,
>  "rel": "self"}, {"href": 
> "http://192.168.24.16:8774/d312a9d1acee46499e04fc2c0cd7e540/images/7c35e28f-fee6-4f0a-a479-67ce8aa1e986";,
>  "rel": "bookmark"}, {"href": 
> "http://192.168.24.16:9292/d312a9d1acee46499e04fc2c0cd7e540/images/7c35e28f-fee6-4f0a-a479-67ce8aa1e986";,
>  "type": "application/vnd.openstack.image", "rel": "alternate"}], "id": 
> "7c35e28f-fee6-4f0a-a479-67ce8aa1e986", "OS-EXT-IMG-SIZE:size": 13167616, 
> "name": "Cirros 0.3.2", "created": "2014-06-25T13:41:25Z", "minDisk": 1, 
> "progress": 100, "minRam": 1, "metadata": {}}, {"status": "ACTIVE", 
> "updated": "2014-06-25T13:38:57Z", "links": [{"href": 
> "http://192.168.24.16:8774/v2/d312a9d1acee46499e04fc2c0cd7e540/images/cfefefc1-eba2-4b1e-9b07-a8c74a872d65";,
>  "rel": "self"}, {"href": 
> "http://192.168.24.16:8774/d312a9d1acee46499e04fc2c0cd7e540/images/cfefefc1-eba2-4b1e-9b07-a8c74a872d65";,
>  "rel": "bookmark"}, {"href": 
> "http://192.168.24.16:9292/d312a9d1acee46499e04fc2c0cd7e540/images/cfefefc1-eba2-4b1e-9b07-a8c74a872d65";,
>  "type": "application/vnd.openstack.image", "rel": "alternate"}], "id": 
> "cfefefc1-eba2-4b1e-9b07-a8c74a872d65", "OS-EXT-IMG-SIZE:size": 254149120, 
> "name": "Ubuntu LTS 14.04", "created": "2014-06-25T13:38:28Z", "minDisk": 8, 
> "progress": 100, "minRam": 1, "metadata": {}}]}"
> -  Error parsing input
> com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: 
> Expected a string but was BEGIN_ARRAY at line 1 column 733
> {code}



--
This message was sent by Atlassian JIRA
(v6.2#6252)

Reply via email to