out.println(Json.asPrettyStringUnchecked(job)); } else { out.printf("Id: %s%n", job.getId()); out.printf("Image: %s%n", job.getImage()); out.printf("Created: %s%n", job.getCreated() == null ? "" : DATE_FORMATTER.format(new Date(job.getCreated()))); out.printf("Expires: %s%n", job.getExpires() == null ? "never" : DATE_FORMATTER.format(job.getExpires())); out.printf("Hostname: %s%n", job.getHostname()); out.printf("Command: %s%n", quote(job.getCommand())); printMap(out, "Env: ", QUOTE, job.getEnv()); out.printf("Health check: %s%n", formatHealthCheck(job.getHealthCheck())); out.printf("Grace period (seconds): %s%n", job.getGracePeriod()); out.printf("Time to wait before kill (seconds): %s%n", job.getSecondsToWaitBeforeKill()); printMap(out, "Metadata: ", QUOTE, job.getMetadata()); printMap(out, "Ports: ", FORMAT_PORTMAPPING, job.getPorts()); printMap(out, "Reg: ", FORMAT_SERVICE_PORTS, job.getRegistration()); out.printf("Security options: %s%n", job.getSecurityOpt()); out.printf("Network mode: %s%n", job.getNetworkMode()); out.printf("Token: %s%n", job.getToken()); printVolumes(out, job.getVolumes()); out.printf("Add capabilities: %s%n", Joiner.on(", ").join(job.getAddCapabilities())); out.printf("Drop capabilities: %s%n", Joiner.on(", ").join(job.getDropCapabilities())); out.printf("Runtime: %s%n", job.getRuntime()); out.printf("Rollout options (null options will fallback to defaults at " + "rolling-update time): %s%n", formatRolloutOptions(job.getRolloutOptions()));
/** * Validate the Job's JobId by checking name, version, and hash are * not null or empty, don't contain invalid characters. * * @param job The Job to check. * * @return A set of error Strings */ private Set<String> validateJobId(final Job job) { final Set<String> errors = Sets.newHashSet(); final JobId jobId = job.getId(); if (jobId == null) { errors.add("Job id was not specified."); return errors; } final String jobIdVersion = jobId.getVersion(); final String jobIdHash = jobId.getHash(); final JobId recomputedId = job.toBuilder().build().getId(); errors.addAll(validateJobName(jobId, recomputedId)); errors.addAll(validateJobVersion(jobIdVersion, recomputedId)); if (this.shouldValidateJobHash) { errors.addAll(validateJobHash(jobIdHash, recomputedId)); } return errors; }
private Set<String> validateGracePeriodAndExternalPorts(final Job job) { final Integer gracePeriod = job.getGracePeriod(); if (gracePeriod != null && gracePeriod > 0 && job.hasExternalPorts()) { return singleton("Job has both grace period and static/external ports. External ports will " + "prevent new containers from deploying during the gracePeriod because of port " + "conflicts. Please choose one or the other."); } return emptySet(); }
@Override protected int runWithJobId(final Namespace options, final HeliosClient client, final PrintStream out, final boolean json, final JobId jobId, final BufferedReader stdin) throws ExecutionException, InterruptedException { final Map<JobId, Job> jobs = client.jobs(jobId.toString()).get(); if (jobs.size() == 0) { out.printf("Unknown job: %s%n", jobId); return 1; } final Job job = Iterables.getOnlyElement(jobs.values()); if (json) { out.println(Json.asPrettyStringUnchecked(job)); } else { out.printf("Id: %s%n", job.getId()); out.printf("Image: %s%n", job.getImage()); out.printf("Hostname: %s%n", job.getHostname()); out.printf("Command: %s%n", quote(job.getCommand())); printMap(out, "Env: ", QUOTE, job.getEnv()); out.printf("Health check: %s%n", formatHealthCheck(job.getHealthCheck())); out.printf("Grace period (seconds): %s%n", job.getGracePeriod()); printMap(out, "Ports: ", FORMAT_PORTMAPPING, job.getPorts()); printMap(out, "Reg: ", FORMAT_SERVICE_PORTS, job.getRegistration()); out.printf("Security options: %s%n", job.getSecurityOpt()); out.printf("Network mode: %s%n", job.getNetworkMode()); out.printf("Token: %s%n", job.getToken()); printVolumes(out, job.getVolumes()); } return 0; }
/** * Generate a random container name. * * @return The random container name. */ public String containerName() { final String shortId = job.getId().toShortString(); final String escaped = CONTAINER_NAME_FORBIDDEN.matcher(shortId).replaceAll("_"); final String random = Integer.toHexString(new SecureRandom().nextInt()); return namespace + "-" + escaped + "_" + random; }
errors.addAll(validateJobImage(job.getImage())); errors.addAll(validateJobHostName(job.getHostname())); for (final PortMapping mapping : job.getPorts().values()) { final Integer externalMappedPort = mapping.getExternalPort(); if (externalPorts.contains(externalMappedPort) && externalMappedPort != null) { for (final Map.Entry<String, PortMapping> entry : job.getPorts().entrySet()) { final String name = entry.getKey(); final PortMapping mapping = entry.getValue(); for (final ServiceEndpoint registration : job.getRegistration().keySet()) { final ServicePorts servicePorts = job.getRegistration().get(registration); if (servicePorts == null || servicePorts.getPorts() == null) { errors.add(format("registration for '%s' is malformed: does not have a port mapping", if (!job.getPorts().containsKey(portName)) { errors.add(format("Service registration refers to missing port mapping: %s=%s", registration, portName)); for (final Map.Entry<String, String> entry : job.getVolumes().entrySet()) { final String path = entry.getKey(); final String source = entry.getValue(); final Date expiry = job.getExpires(); final Date now = new Date(); if (expiry != null && expiry.before(now)) { for (final String mountPoint : job.getRamdisks().keySet()) {
final Job expected = Job.newBuilder() .setName(testJobName) .setVersion(testJobVersion) final Job expectedCloned = expected.toBuilder() .setVersion(expected.getId().getVersion() + "-cloned") .build(); final JobId clonedJobId = JobId.parse(CharMatcher.whitespace().trimFrom( final Job job = statuses.get(jobId).getJob(); assertEquals(ServicePorts.of("foo"), job.getRegistration().get(ServiceEndpoint.of("foo-service", "tcp"))); assertEquals(ServicePorts.of("bar"), job.getRegistration().get(ServiceEndpoint.of("bar-service", "http"))); assertEquals(4711, job.getPorts().get("foo").getInternalPort()); assertEquals(PortMapping.of(5000, externalPort), job.getPorts().get("bar")); assertEquals("f00d", job.getEnv().get("BAD"));
final Job job = Job.newBuilder() .setName(testJobName) .setVersion(testJobVersion) .setCreatingUser(TEST_USER) .build(); final JobId jobId = job.getId(); client.createJob(job).get(); final Job job2 = Job.newBuilder() .setName(testJobName + "2") .setVersion(testJobVersion) .setCreatingUser(TEST_USER) .build(); final JobId job2Id = job2.getId(); client.createJob(job2).get();
final String config = new String(bytes, UTF_8); final Job job = Json.read(config, Job.class); builder = job.toBuilder(); } else if (templateJobId != null) { final Map<JobId, Job> jobs = client.jobs(templateJobId).get(); builder = template.toBuilder(); if (id == null) { throw new IllegalArgumentException("Please specify new job name and version"); "Please specify a file, or a template, or a job name, version and container image"); builder = Job.newBuilder(); final CreateJobResponse createJobResponse = new CreateJobResponse( CreateJobResponse.Status.INVALID_JOB_DEFINITION, ImmutableList.copyOf(errors), job.getId().toString()); out.println(createJobResponse.toJsonString()); out.println("Creating job: " + job.toJsonString());
final Job job = jobs.get(jobId); assertEquals(name, job.getId().getName()); assertEquals(version, job.getId().getVersion()); assertEquals(ports, job.getPorts()); assertEquals(env, job.getEnv()); assertEquals(registration, job.getRegistration());
private List<Integer> staticPorts(final Job job) { final List<Integer> staticPorts = Lists.newArrayList(); for (final PortMapping portMapping : job.getPorts().values()) { if (portMapping.getExternalPort() != null) { staticPorts.add(portMapping.getExternalPort()); } } return staticPorts; }
final Job job = Job.newBuilder() .setName(testJobName) .setVersion(testJobVersion) .setCreatingUser(TEST_USER) .build(); final JobId jobId = job.getId(); final CreateJobResponse created = client.createJob(job).get(); assertEquals(CreateJobResponse.Status.OK, created.getStatus()); assertEquals(BUSYBOX_WITH_DIGEST, matchJobs.get(jobId).getImage());
/** * Create docker container configuration for a job. * * @param imageInfo The ImageInfo object. * * @return The ContainerConfig object. */ public ContainerConfig containerConfig(final ImageInfo imageInfo, final Optional<String> dockerVersion) { final ContainerConfig.Builder builder = ContainerConfig.builder(); builder.image(job.getImage()); builder.cmd(job.getCommand()); builder.hostname(job.getHostname()); builder.env(containerEnvStrings()); builder.exposedPorts(containerExposedPorts()); builder.volumes(volumes().keySet()); builder.labels(job.getLabels()); for (final ContainerDecorator decorator : containerDecorators) { decorator.decorateContainerConfig(job, imageInfo, dockerVersion, builder); } return builder.build(); }
job.getRegistration().entrySet()) { final ServiceEndpoint registration = entry.getKey(); final ServicePorts servicePorts = entry.getValue(); final String portName = portEntry.getKey(); final ServicePortParameters portParameters = portEntry.getValue(); final PortMapping mapping = job.getPorts().get(portName); if (mapping == null) { log.error("no '{}' port mapped for registration: '{}'", portName, registration);
final Job.Builder builder = Job.newBuilder() .setCommand(Lists.newArrayList("server", "foo-service.yaml")) .setEnv(env) .setCreatingUser(TEST_USER); final Job job = builder.build(); final String jobConfigJsonString = job.toJsonString(); final Job.Builder actualJobBuilder = actualJob.toBuilder(); builder.setName(testJobName).setVersion(testJobVersion).setImage(BUSYBOX) .setEnv(ImmutableMap.of(redundantEnvKey, "FOOD"));
protected void assertJobEquals(final Job expected, final Job actual) { final Builder expectedBuilder = expected.toBuilder(); // hack to make sure that any environment variables that were folded into the created job // because of environment variables set at runtime on the test-running-agent are removed // from the actual when we assert the equality below final Builder actualBuilder = actual.toBuilder(); final Map<String, String> metadata = Maps.newHashMap(actual.getMetadata()); for (final Map.Entry<String, String> entry : DEFAULT_METADATA_ENVVARS.entrySet()) { final String envVar = entry.getKey(); final String metadataKey = entry.getValue(); final String envValue = System.getenv(envVar); if (envValue != null && actual.getMetadata().containsKey(metadataKey) && actual.getMetadata().get(metadataKey).equals(envValue)) { metadata.remove(metadataKey); } } actualBuilder.setMetadata(metadata); // Remove created timestamp set by master actualBuilder.setCreated(null); // copy the hash expectedBuilder.setHash(actualBuilder.build().getId().getHash()); assertEquals(expectedBuilder.build(), actualBuilder.build()); }
final HealthCheck healthCheck = job.getHealthCheck(); final Map<String, PortMapping> ports = job.getPorts(); if (isNullOrEmpty(port)) { errors.add("A port must be defined for HTTP and TCP health checks.");