airlift / airship Goto Github PK
View Code? Open in Web Editor NEWAirship is a software deployment and management tool
Airship is a software deployment and management tool
airship
Performing an 'airship install --all' only tries to install the specified software on one server, not all available servers. Doing some packet sniffing it does seem like the Coordinator returns all of the existing servers, but the airship cli must not be handling them correctly.
I have tested this with 3 existing airship agents.
Steps that work for me to reproduce:
My airship cli server is a RHEL 6.x Linux box with the latest JDK from Oracle and I'm running as the root user.
Command:
# airship --debug install -u f9cc discovery-server:1.4 @discovery:1-SNAPSHOT
2012-11-19T18:45:58.173-0800 INFO main io.airlift.log.Logging Logging to stderr
Exception in thread "main" java.lang.RuntimeException: Server Error
at io.airlift.airship.cli.HttpCommander.showAgents(HttpCommander.java:282)
at io.airlift.airship.cli.Airship$InstallCommand.execute(Airship.java:437)
at io.airlift.airship.cli.Airship$AirshipCommanderCommand.execute(Airship.java:270)
at io.airlift.airship.cli.Airship$AirshipCommanderCommand.execute(Airship.java:214)
at io.airlift.airship.cli.Airship$AirshipCommand.call(Airship.java:173)
at io.airlift.airship.cli.Airship.main(Airship.java:147)
Launcher log:
2012-11-19T18:45:58.774-0800 WARN http-worker-85 org.eclipse.jetty.servlet.ServletHandler /v1/admin/agent
java.lang.NullPointerException: null
at io.airlift.airship.coordinator.StringFunctions$1.apply(StringFunctions.java:20) ~[main.jar:0.9-SNAPSHOT]
at io.airlift.airship.coordinator.StringFunctions$1.apply(StringFunctions.java:17) ~[main.jar:0.9-SNAPSHOT]
at com.google.common.base.Predicates$CompositionPredicate.apply(Predicates.java:534) ~[guava-12.0.jar:na]
at com.google.common.collect.Iterators$8.computeNext(Iterators.java:688) ~[guava-12.0.jar:na]
at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143) ~[guava-12.0.jar:na]
at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138) ~[guava-12.0.jar:na]
at com.google.common.collect.Iterators.size(Iterators.java:191) ~[guava-12.0.jar:na]
at com.google.common.collect.Collections2$FilteredCollection.size(Collections2.java:228) ~[guava-12.0.jar:na]
at io.airlift.airship.coordinator.AgentFilterBuilder$UuidPredicate.<init>(AgentFilterBuilder.java:273) ~[main.jar:0.9-SNAPSHOT]
at io.airlift.airship.coordinator.AgentFilterBuilder$1.apply(AgentFilterBuilder.java:160) ~[main.jar:0.9-SNAPSHOT]
at io.airlift.airship.coordinator.AgentFilterBuilder$1.apply(AgentFilterBuilder.java:156) ~[main.jar:0.9-SNAPSHOT]
at com.google.common.collect.Lists$TransformingRandomAccessList.get(Lists.java:491) ~[guava-12.0.jar:na]
at java.util.AbstractList$Itr.next(AbstractList.java:358) ~[na:1.7.0_06]
at com.google.common.base.Predicates.defensiveCopy(Predicates.java:619) ~[guava-12.0.jar:na]
at com.google.common.base.Predicates.or(Predicates.java:146) ~[guava-12.0.jar:na]
at io.airlift.airship.coordinator.AgentFilterBuilder.build(AgentFilterBuilder.java:155) ~[main.jar:0.9-SNAPSHOT]
at io.airlift.airship.coordinator.AgentFilterBuilder.build(AgentFilterBuilder.java:94) ~[main.jar:0.9-SNAPSHOT]
at io.airlift.airship.coordinator.AdminResource.getAllAgents(AdminResource.java:78) ~[main.jar:0.9-SNAPSHOT]
at sun.reflect.GeneratedMethodAccessor33.invoke(Unknown Source) ~[na:na]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_06]
at java.lang.reflect.Method.invoke(Method.java:601) ~[na:1.7.0_06]
at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60) ~[jersey-server-1.9.1.jar:1.9.1]
at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:205) ~[jersey-server-1.9.1.jar:1.9.1]
at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75) ~[jersey-server-1.9.1.jar:1.9.1]
at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288) ~[jersey-server-1.9.1.jar:1.9.1]
at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) ~[jersey-server-1.9.1.jar:1.9.1]
at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108) ~[jersey-server-1.9.1.jar:1.9.1]
at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) ~[jersey-server-1.9.1.jar:1.9.1]
at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84) ~[jersey-server-1.9.1.jar:1.9.1]
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1469) ~[jersey-server-1.9.1.jar:1.9.1]
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1400) ~[jersey-server-1.9.1.jar:1.9.1]
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349) ~[jersey-server-1.9.1.jar:1.9.1]
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339) ~[jersey-server-1.9.1.jar:1.9.1]
at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416) ~[jersey-server-1.9.1.jar:1.9.1]
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537) ~[jersey-server-1.9.1.jar:1.9.1]
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:708) ~[jersey-server-1.9.1.jar:1.9.1]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:848) ~[javax.servlet-3.0.0.v201112011016.jar:na]
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:594) ~[jetty-servlet-8.1.1.v20120215.jar:8.1.1.v20120215]
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1365) ~[jetty-servlet-8.1.1.v20120215.jar:8.1.1.v20120215]
at io.airlift.airship.coordinator.auth.AuthFilter.doFilter(AuthFilter.java:70) ~[main.jar:0.9-SNAPSHOT]
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1336) ~[jetty-servlet-8.1.1.v20120215.jar:8.1.1.v20120215]
at io.airlift.http.server.GZipRequestFilter.doFilter(GZipRequestFilter.java:49) ~[http-server-0.66.jar:na]
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1336) ~[jetty-servlet-8.1.1.v20120215.jar:8.1.1.v20120215]
at org.eclipse.jetty.servlets.UserAgentFilter.doFilter(UserAgentFilter.java:77) ~[jetty-servlets-8.1.1.v20120215.jar:8.1.1.v20120215]
at org.eclipse.jetty.servlets.GzipFilter.doFilter(GzipFilter.java:181) ~[jetty-servlets-8.1.1.v20120215.jar:8.1.1.v20120215]
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1336) ~[jetty-servlet-8.1.1.v20120215.jar:8.1.1.v20120215]
at io.airlift.http.server.TimingFilter.doFilter(TimingFilter.java:50) ~[http-server-0.66.jar:na]
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1336) ~[jetty-servlet-8.1.1.v20120215.jar:8.1.1.v20120215]
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:483) [jetty-servlet-8.1.1.v20120215.jar:8.1.1.v20120215]
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1065) [jetty-server-8.1.1.v20120215.jar:8.1.1.v20120215]
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:412) [jetty-servlet-8.1.1.v20120215.jar:8.1.1.v20120215]
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:999) [jetty-server-8.1.1.v20120215.jar:8.1.1.v20120215]
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117) [jetty-server-8.1.1.v20120215.jar:8.1.1.v20120215]
at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:149) [jetty-server-8.1.1.v20120215.jar:8.1.1.v20120215]
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:111) [jetty-server-8.1.1.v20120215.jar:8.1.1.v20120215]
at org.eclipse.jetty.server.handler.StatisticsHandler.handle(StatisticsHandler.java:121) [jetty-server-8.1.1.v20120215.jar:8.1.1.v20120215]
at org.eclipse.jetty.server.handler.HandlerList.handle(HandlerList.java:47) [jetty-server-8.1.1.v20120215.jar:8.1.1.v20120215]
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:111) [jetty-server-8.1.1.v20120215.jar:8.1.1.v20120215]
at org.eclipse.jetty.server.Server.handle(Server.java:351) [jetty-server-8.1.1.v20120215.jar:8.1.1.v20120215]
at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:454) [jetty-server-8.1.1.v20120215.jar:8.1.1.v20120215]
at org.eclipse.jetty.server.AbstractHttpConnection.messageComplete(AbstractHttpConnection.java:909) [jetty-server-8.1.1.v20120215.jar:8.1.1.v20120215]
at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.messageComplete(AbstractHttpConnection.java:966) [jetty-server-8.1.1.v20120215.jar:8.1.1.v20120215]
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:897) [jetty-http-8.1.1.v20120215.jar:8.1.1.v20120215]
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235) [jetty-http-8.1.1.v20120215.jar:8.1.1.v20120215]
at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:76) [jetty-server-8.1.1.v20120215.jar:8.1.1.v20120215]
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:609) [jetty-io-8.1.1.v20120215.jar:8.1.1.v20120215]
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:45) [jetty-io-8.1.1.v20120215.jar:8.1.1.v20120215]
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:599) [jetty-util-8.1.1.v20120215.jar:8.1.1.v20120215]
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:534) [jetty-util-8.1.1.v20120215.jar:8.1.1.v20120215]
at java.lang.Thread.run(Thread.java:722) [na:1.7.0_06]
I created a configuration bundle using asconfig that did not have a jvm.properties and I was allowed to create this bundle and discovered the issue when the server started up. Would be nice to be warned while creating the configuration that its insufficient.
To repro:
At this point the aws-credentials.properties file has been deleted by the config upgrade and the coordinator both dies and is not recoverable.
The ssh command always uses the local username when connecting to a remote machine. This is generally never what's expected; especially in the case of AWS where all the machines have a single username.
An NPE occurs if the settings file doesn't have a <server>
entry with a matching <id>
. The result of settings.getServer(...)
needs to be checked for null with an appropriate user error thrown.
Exception in thread "main" java.lang.NullPointerException
at io.airlift.airship.configbundler.Maven.makeRemoteRepository(Maven.java:102)
at io.airlift.airship.configbundler.Maven.<init>(Maven.java:90)
at io.airlift.airship.configbundler.SnapshotCommand.call(SnapshotCommand.java:60)
at io.airlift.airship.configbundler.SnapshotCommand.call(SnapshotCommand.java:21)
at io.airlift.airship.configbundler.ConfigBundler.main(ConfigBundler.java:31)
Additionally, the constructor for that class has the repository info parameters as @Nullable
when they should not be. The validateRepositoryMetadata
method should validate them as not null.
Currently the config bundler doesn't push to the local maven repo making it difficult to install locally built software with local configs.
The config bundler is broken after 0.11, but worked in 0.10.
There are two issues; first you can not initialize a new config repo:
$ asconfig-0.12 init --groupId com.example.config --releasesRepository nexus --snapshotsRepository nexus --releasesRepositoryUri 'http://192.168.193.6:8082/nexus/content/repositories/releases' --snapshotsRepositoryUri 'http://192.168.193.6:8082/nexus/content/repositories/snapshots'
Exception in thread "main" java.lang.IllegalArgumentException: io.airlift.airship.configbundler.Metadata could not be converted to json
at io.airlift.json.JsonCodec.toJson(JsonCodec.java:142)
at io.airlift.airship.configbundler.Metadata.save(Metadata.java:48)
at io.airlift.airship.configbundler.Model.initialize(Model.java:88)
at io.airlift.airship.configbundler.InitCommand.call(InitCommand.java:57)
at io.airlift.airship.configbundler.InitCommand.call(InitCommand.java:12)
at io.airlift.airship.configbundler.ConfigBundler.main(ConfigBundler.java:30)
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Class com.fasterxml.jackson.databind.ser.BeanPropertyWriter can not access a member of class io.airlift.airship.configbundler.Metadata with modifiers "public" (through reference chain: io.airlift.airship.configbundler.Metadata["groupId"])
at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:232)
at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:197)
at com.fasterxml.jackson.databind.ser.std.StdSerializer.wrapAndThrow(StdSerializer.java:183)
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:559)
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:143)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:120)
at com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:2623)
at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:2119)
at io.airlift.json.JsonCodec.toJson(JsonCodec.java:139)
... 5 more
Caused by: java.lang.IllegalAccessException: Class com.fasterxml.jackson.databind.ser.BeanPropertyWriter can not access a member of class io.airlift.airship.configbundler.Metadata with modifiers "public"
at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:95)
at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(AccessibleObject.java:261)
at java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:253)
at java.lang.reflect.Method.invoke(Method.java:594)
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.get(BeanPropertyWriter.java:653)
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:509)
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:551)
... 10 more
Second, you can not work with a currently created config repo:
$ asconfig-0.12 snapshot
Exception in thread "main" java.lang.IllegalArgumentException: Invalid [simple type, class io.airlift.airship.configbundler.Metadata] json string
at io.airlift.json.JsonCodec.fromJson(JsonCodec.java:124)
at io.airlift.airship.configbundler.Model.readMetadata(Model.java:65)
at io.airlift.airship.configbundler.SnapshotCommand.call(SnapshotCommand.java:30)
at io.airlift.airship.configbundler.SnapshotCommand.call(SnapshotCommand.java:16)
at io.airlift.airship.configbundler.ConfigBundler.main(ConfigBundler.java:30)
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Could not find creator property with name 'groupId' (in class io.airlift.airship.configbundler.Metadata)
at [Source: java.io.StringReader@19fc0a04; line: 1, column: 1]
at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:164)
at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:608)
at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.addBeanProps(BeanDeserializerFactory.java:551)
at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.buildBeanDeserializer(BeanDeserializerFactory.java:267)
at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.createBeanDeserializer(BeanDeserializerFactory.java:171)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:388)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:264)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244)
at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:143)
at com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:342)
at com.fasterxml.jackson.databind.ObjectMapper._findRootDeserializer(ObjectMapper.java:2895)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2789)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:1957)
at io.airlift.json.JsonCodec.fromJson(JsonCodec.java:121)
... 4 more
'''
Repro steps:
Nuff said.
The config bundler when creating a release pushes the artifact up to nexus, but does not push the tag to git. This can cause problems if someone forgets to push the tags for the released config.
Is this expected behavior?
$ airship --debug coordinator ssh
2013-06-11T12:25:32.703-0700 INFO main io.airlift.log.Logging Logging to stderr
Exception in thread "main" UnexpectedResponseException{request=Request{uri=http://ec2-23-22-68-45.compute-1.amazonaws.com:64000/v1/admin/coordinator, method=GET, headers={}, bodyGenerator=null}, statusCode=500, statusMessage=Cannot compute unique prefix size for collection with duplicate entries, headers={Content-Length=[1411], Content-Type=[text/html;charset=ISO-8859-1], Cache-Control=[must-revalidate,no-cache,no-store]}}
at io.airlift.http.client.JsonResponseHandler.handle(JsonResponseHandler.java:75)
at io.airlift.http.client.ApacheHttpClient$1.handleResponse(ApacheHttpClient.java:134)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:1070)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:1044)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:1035)
at io.airlift.http.client.ApacheHttpClient.execute(ApacheHttpClient.java:122)
at io.airlift.airship.cli.HttpCommander.sshCoordinator(HttpCommander.java:268)
at io.airlift.airship.cli.Airship$CoordinatorSshCommand.execute(Airship.java:818)
at io.airlift.airship.cli.Airship$AirshipCommanderCommand.execute(Airship.java:276)
at io.airlift.airship.cli.Airship$AirshipCommanderCommand.execute(Airship.java:220)
at io.airlift.airship.cli.Airship$AirshipCommand.call(Airship.java:179)
at io.airlift.airship.cli.Airship.main(Airship.java:153)
First provisioned a coordinator; which worked correctly:
$ ./airship environment provision-aws --coordinator-config \
> com.example.config:airship-coordinator:1 \
> --instance-type t1.micro --security-group sec-group --ami ami-3e41d257 --key-pair airship-test \
> --repository http://example.com:8082/nexus/content/groups/public/ staging
Waiting for access key to register with AWS......done!
Second tried to provision some agents:
$ ./airship agent provision --agent-config @com.example.config:agent-aws-t1.micro:1 \
> --instance-type t1.micro --security-group sec-group --ami ami-3e41d257 \
> --key-pair airship-test --count 3
And get this:
Exception in thread "main" java.lang.NoClassDefFoundError: jnr/ffi/Struct
at jnr.posix.POSIXFactory.<clinit>(POSIXFactory.java:12)
at io.airlift.airship.cli.POSIXFactory.getPOSIX(POSIXFactory.java:22)
at io.airlift.airship.cli.Ansi.<clinit>(Ansi.java:15)
at io.airlift.airship.cli.SimpleRecord$Builder.addValue(SimpleRecord.java:56)
at io.airlift.airship.cli.TablePrinter.<init>(TablePrinter.java:40)
at io.airlift.airship.cli.TablePrinter.<init>(TablePrinter.java:28)
at io.airlift.airship.cli.TableOutputFormat.displayAgents(TableOutputFormat.java:52)
at io.airlift.airship.cli.Airship$AirshipCommanderCommand.displayAgents(Airship.java:332)
at io.airlift.airship.cli.Airship$AgentProvisionCommand.execute(Airship.java:866)
at io.airlift.airship.cli.Airship$AirshipCommanderCommand.execute(Airship.java:274)
at io.airlift.airship.cli.Airship$AirshipCommanderCommand.execute(Airship.java:218)
at io.airlift.airship.cli.Airship$AirshipCommand.call(Airship.java:177)
at io.airlift.airship.cli.Airship.main(Airship.java:151)
Caused by: java.lang.ClassNotFoundException: jnr.ffi.Struct
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
... 13 more
The machines do start, but it is impossible to do anything with them:
$ ./airship agent
Exception in thread "main" java.lang.NoClassDefFoundError: jnr/ffi/Struct
at jnr.posix.POSIXFactory.<clinit>(POSIXFactory.java:12)
at io.airlift.airship.cli.POSIXFactory.getPOSIX(POSIXFactory.java:22)
at io.airlift.airship.cli.Ansi.<clinit>(Ansi.java:15)
at io.airlift.airship.cli.SimpleRecord$Builder.addValue(SimpleRecord.java:56)
at io.airlift.airship.cli.TablePrinter.<init>(TablePrinter.java:40)
at io.airlift.airship.cli.TablePrinter.<init>(TablePrinter.java:28)
at io.airlift.airship.cli.TableOutputFormat.displayAgents(TableOutputFormat.java:52)
at io.airlift.airship.cli.Airship$AirshipCommanderCommand.displayAgents(Airship.java:332)
at io.airlift.airship.cli.Airship$AgentShowCommand.execute(Airship.java:819)
at io.airlift.airship.cli.Airship$AirshipCommanderCommand.execute(Airship.java:274)
at io.airlift.airship.cli.Airship$AirshipCommanderCommand.execute(Airship.java:218)
at io.airlift.airship.cli.Airship$AirshipCommand.call(Airship.java:177)
at io.airlift.airship.cli.Airship.main(Airship.java:151)
Caused by: java.lang.ClassNotFoundException: jnr.ffi.Struct
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
If you have a repository that you clone who's HEAD points to a different branch than master (on initial clone) you can not do a release or snapshot until the master branch is checked out.
Theoretical reproduction:
$ git clone {git repo} foo
$ cd foo
$ git checkout config-branch
$ asconfig snapshot
Exception in thread "main" java.lang.NullPointerException
at io.airlift.airship.configbundler.Model.readMetadata(Model.java:60)
at io.airlift.airship.configbundler.SnapshotCommand.call(SnapshotCommand.java:35)
at io.airlift.airship.configbundler.SnapshotCommand.call(SnapshotCommand.java:21)
at io.airlift.airship.configbundler.ConfigBundler.main(ConfigBundler.java:31)
This problem goes away after you checkout the master branch.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.