Ejemplo n.º 1
0
func main() {
	flag.Parse()

	if flag.NArg() < 1 {
		log.Fatal(usage)
	}
	if *podName == "" {
		if flag.NArg() > 1 {
			log.Fatal(usage)
		}
		_, *podName = parseDockerImage(flag.Arg(0))
	}

	if (!*generateJSON && !*generateYAML) || (*generateJSON && *generateYAML) {
		log.Fatal(usage)
	}

	dockerHost := os.Getenv("DOCKER_HOST")
	if dockerHost == "" {
		log.Fatalf("DOCKER_HOST is not set")
	}
	docker, err := dockerclient.NewClient(dockerHost)
	if err != nil {
		log.Fatalf("failed to connect to %q: %v", dockerHost, err)
	}

	podContainers := []v1beta1.Container{}

	for _, imageName := range flag.Args() {
		parts, baseName := parseDockerImage(imageName)
		container := v1beta1.Container{
			Name:  baseName,
			Image: imageName,
		}

		// TODO(proppy): use the regitry API instead of the remote API to get image metadata.
		img, err := docker.InspectImage(imageName)
		if err != nil {
			log.Fatalf("failed to inspect image %q: %v", imageName, err)
		}
		for p := range img.Config.ExposedPorts {
			port, err := strconv.Atoi(p.Port())
			if err != nil {
				log.Fatalf("failed to parse port %q: %v", parts[0], err)
			}
			container.Ports = append(container.Ports, v1beta1.Port{
				Name:          strings.Join([]string{baseName, p.Proto(), p.Port()}, "-"),
				ContainerPort: port,
				Protocol:      v1beta1.Protocol(strings.ToUpper(p.Proto())),
			})
		}
		podContainers = append(podContainers, container)
	}

	// TODO(proppy): add flag to handle multiple version
	manifest := v1beta1.ContainerManifest{
		Version:    "v1beta1",
		ID:         *podName + "-pod",
		Containers: podContainers,
		RestartPolicy: v1beta1.RestartPolicy{
			Always: &v1beta1.RestartPolicyAlways{},
		},
	}

	if *generateJSON {
		bs, err := json.MarshalIndent(manifest, "", "  ")
		if err != nil {
			log.Fatalf("failed to render JSON container manifest: %v", err)
		}
		os.Stdout.Write(bs)
	}
	if *generateYAML {
		bs, err := yaml.Marshal(manifest)
		if err != nil {
			log.Fatalf("failed to render YAML container manifest: %v", err)
		}
		os.Stdout.Write(bs)
	}
}
Ejemplo n.º 2
0
func main() {
	flag.Parse()

	if flag.NArg() < 1 {
		log.Fatal(usage)
	}
	if *podName == "" {
		if flag.NArg() > 1 {
			log.Print(usage)
			log.Fatal("podex: -id arg is required when passing more than one image")
		}
		_, _, *podName, _ = splitDockerImageName(flag.Arg(0))
	}

	if (!*generateJSON && !*generateYAML) || (*generateJSON && *generateYAML) {
		log.Fatal(usage)
	}

	podContainers := []v1beta1.Container{}

	for _, imageName := range flag.Args() {
		host, namespace, repo, tag := splitDockerImageName(imageName)

		container := v1beta1.Container{
			Name:  repo,
			Image: imageName,
		}

		img, err := getImageMetadata(host, namespace, repo, tag)

		if err != nil {
			log.Fatalf("failed to get image metadata %q: %v", imageName, err)
		}
		for p := range img.ContainerConfig.ExposedPorts {
			port, err := strconv.Atoi(p.Port())
			if err != nil {
				log.Fatalf("failed to parse port %q: %v", p.Port(), err)
			}
			container.Ports = append(container.Ports, v1beta1.Port{
				Name:          strings.Join([]string{repo, p.Proto(), p.Port()}, "-"),
				ContainerPort: port,
				Protocol:      v1beta1.Protocol(strings.ToUpper(p.Proto())),
			})
		}
		podContainers = append(podContainers, container)
	}

	// TODO(proppy): add flag to handle multiple version
	manifest := v1beta1.ContainerManifest{
		Version:    "v1beta1",
		ID:         *podName + "-pod",
		Containers: podContainers,
		RestartPolicy: v1beta1.RestartPolicy{
			Always: &v1beta1.RestartPolicyAlways{},
		},
	}

	if *generateJSON {
		bs, err := json.MarshalIndent(manifest, "", "  ")
		if err != nil {
			log.Fatalf("failed to render JSON container manifest: %v", err)
		}
		os.Stdout.Write(bs)
	}
	if *generateYAML {
		bs, err := yaml.Marshal(manifest)
		if err != nil {
			log.Fatalf("failed to render YAML container manifest: %v", err)
		}
		os.Stdout.Write(bs)
	}
}