mirror of
https://github.com/containers/podman.git
synced 2025-12-12 09:50:25 +08:00
Merge pull request #8581 from baude/kubegen
generate kube on multiple containers
This commit is contained in:
@@ -60,7 +60,8 @@ func GenerateKube(w http.ResponseWriter, r *http.Request) {
|
||||
runtime := r.Context().Value("runtime").(*libpod.Runtime)
|
||||
decoder := r.Context().Value("decoder").(*schema.Decoder)
|
||||
query := struct {
|
||||
Service bool `schema:"service"`
|
||||
Names []string `schema:"names"`
|
||||
Service bool `schema:"service"`
|
||||
}{
|
||||
// Defaults would go here.
|
||||
}
|
||||
@@ -73,7 +74,7 @@ func GenerateKube(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
containerEngine := abi.ContainerEngine{Libpod: runtime}
|
||||
options := entities.GenerateKubeOptions{Service: query.Service}
|
||||
report, err := containerEngine.GenerateKube(r.Context(), utils.GetName(r), options)
|
||||
report, err := containerEngine.GenerateKube(r.Context(), query.Names, options)
|
||||
if err != nil {
|
||||
utils.Error(w, "Something went wrong.", http.StatusInternalServerError, errors.Wrap(err, "error generating YAML"))
|
||||
return
|
||||
|
||||
@@ -70,7 +70,7 @@ func (s *APIServer) registerGenerateHandlers(r *mux.Router) error {
|
||||
// $ref: "#/responses/InternalError"
|
||||
r.HandleFunc(VersionedPath("/libpod/generate/{name:.*}/systemd"), s.APIHandler(libpod.GenerateSystemd)).Methods(http.MethodGet)
|
||||
|
||||
// swagger:operation GET /libpod/generate/{name:.*}/kube libpod libpodGenerateKube
|
||||
// swagger:operation GET /libpod/generate/kube libpod libpodGenerateKube
|
||||
// ---
|
||||
// tags:
|
||||
// - containers
|
||||
@@ -78,9 +78,11 @@ func (s *APIServer) registerGenerateHandlers(r *mux.Router) error {
|
||||
// summary: Generate a Kubernetes YAML file.
|
||||
// description: Generate Kubernetes YAML based on a pod or container.
|
||||
// parameters:
|
||||
// - in: path
|
||||
// name: name:.*
|
||||
// type: string
|
||||
// - in: query
|
||||
// name: names
|
||||
// type: array
|
||||
// items:
|
||||
// type: string
|
||||
// required: true
|
||||
// description: Name or ID of the container or pod.
|
||||
// - in: query
|
||||
@@ -98,6 +100,6 @@ func (s *APIServer) registerGenerateHandlers(r *mux.Router) error {
|
||||
// format: binary
|
||||
// 500:
|
||||
// $ref: "#/responses/InternalError"
|
||||
r.HandleFunc(VersionedPath("/libpod/generate/{name:.*}/kube"), s.APIHandler(libpod.GenerateKube)).Methods(http.MethodGet)
|
||||
r.HandleFunc(VersionedPath("/libpod/generate/kube"), s.APIHandler(libpod.GenerateKube)).Methods(http.MethodGet)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package generate
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"strconv"
|
||||
@@ -37,15 +38,21 @@ func Systemd(ctx context.Context, nameOrID string, options entities.GenerateSyst
|
||||
return report, response.Process(&report.Units)
|
||||
}
|
||||
|
||||
func Kube(ctx context.Context, nameOrID string, options entities.GenerateKubeOptions) (*entities.GenerateKubeReport, error) {
|
||||
func Kube(ctx context.Context, nameOrIDs []string, options entities.GenerateKubeOptions) (*entities.GenerateKubeReport, error) {
|
||||
conn, err := bindings.GetClient(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if len(nameOrIDs) < 1 {
|
||||
return nil, errors.New("must provide the name or ID of one container or pod")
|
||||
}
|
||||
params := url.Values{}
|
||||
for _, name := range nameOrIDs {
|
||||
params.Add("names", name)
|
||||
}
|
||||
params.Set("service", strconv.FormatBool(options.Service))
|
||||
|
||||
response, err := conn.DoRequest(nil, http.MethodGet, "/generate/%s/kube", params, nil, nameOrID)
|
||||
response, err := conn.DoRequest(nil, http.MethodGet, "/generate/kube", params, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -46,7 +46,7 @@ type ContainerEngine interface {
|
||||
ContainerWait(ctx context.Context, namesOrIds []string, options WaitOptions) ([]WaitReport, error)
|
||||
Events(ctx context.Context, opts EventsOptions) error
|
||||
GenerateSystemd(ctx context.Context, nameOrID string, opts GenerateSystemdOptions) (*GenerateSystemdReport, error)
|
||||
GenerateKube(ctx context.Context, nameOrID string, opts GenerateKubeOptions) (*GenerateKubeReport, error)
|
||||
GenerateKube(ctx context.Context, nameOrIDs []string, opts GenerateKubeOptions) (*GenerateKubeReport, error)
|
||||
SystemPrune(ctx context.Context, options SystemPruneOptions) (*SystemPruneReport, error)
|
||||
HealthCheckRun(ctx context.Context, nameOrID string, options HealthCheckOptions) (*define.HealthCheckResults, error)
|
||||
Info(ctx context.Context) (*define.Info, error)
|
||||
|
||||
@@ -41,28 +41,48 @@ func (ic *ContainerEngine) GenerateSystemd(ctx context.Context, nameOrID string,
|
||||
return &entities.GenerateSystemdReport{Units: units}, nil
|
||||
}
|
||||
|
||||
func (ic *ContainerEngine) GenerateKube(ctx context.Context, nameOrID string, options entities.GenerateKubeOptions) (*entities.GenerateKubeReport, error) {
|
||||
func (ic *ContainerEngine) GenerateKube(ctx context.Context, nameOrIDs []string, options entities.GenerateKubeOptions) (*entities.GenerateKubeReport, error) {
|
||||
var (
|
||||
pod *libpod.Pod
|
||||
pods []*libpod.Pod
|
||||
podYAML *k8sAPI.Pod
|
||||
err error
|
||||
ctr *libpod.Container
|
||||
ctrs []*libpod.Container
|
||||
servicePorts []k8sAPI.ServicePort
|
||||
serviceYAML k8sAPI.Service
|
||||
)
|
||||
// Get the container in question.
|
||||
ctr, err = ic.Libpod.LookupContainer(nameOrID)
|
||||
if err != nil {
|
||||
pod, err = ic.Libpod.LookupPod(nameOrID)
|
||||
for _, nameOrID := range nameOrIDs {
|
||||
// Get the container in question
|
||||
ctr, err := ic.Libpod.LookupContainer(nameOrID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
pod, err := ic.Libpod.LookupPod(nameOrID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
pods = append(pods, pod)
|
||||
if len(pods) > 1 {
|
||||
return nil, errors.New("can only generate single pod at a time")
|
||||
}
|
||||
} else {
|
||||
if len(ctr.Dependencies()) > 0 {
|
||||
return nil, errors.Wrapf(define.ErrNotImplemented, "containers with dependencies")
|
||||
}
|
||||
// we cannot deal with ctrs already in a pod
|
||||
if len(ctr.PodID()) > 0 {
|
||||
return nil, errors.Errorf("container %s is associated with pod %s: use generate on the pod itself", ctr.ID(), ctr.PodID())
|
||||
}
|
||||
ctrs = append(ctrs, ctr)
|
||||
}
|
||||
podYAML, servicePorts, err = pod.GenerateForKube()
|
||||
}
|
||||
|
||||
// check our inputs
|
||||
if len(pods) > 0 && len(ctrs) > 0 {
|
||||
return nil, errors.New("cannot generate pods and containers at the same time")
|
||||
}
|
||||
|
||||
if len(pods) == 1 {
|
||||
podYAML, servicePorts, err = pods[0].GenerateForKube()
|
||||
} else {
|
||||
if len(ctr.Dependencies()) > 0 {
|
||||
return nil, errors.Wrapf(define.ErrNotImplemented, "containers with dependencies")
|
||||
}
|
||||
podYAML, err = ctr.GenerateForKube()
|
||||
podYAML, err = libpod.GenerateForKube(ctrs)
|
||||
}
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -72,7 +92,7 @@ func (ic *ContainerEngine) GenerateKube(ctx context.Context, nameOrID string, op
|
||||
serviceYAML = libpod.GenerateKubeServiceFromV1Pod(podYAML, servicePorts)
|
||||
}
|
||||
|
||||
content, err := generateKubeOutput(podYAML, &serviceYAML)
|
||||
content, err := generateKubeOutput(podYAML, &serviceYAML, options.Service)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -80,7 +100,7 @@ func (ic *ContainerEngine) GenerateKube(ctx context.Context, nameOrID string, op
|
||||
return &entities.GenerateKubeReport{Reader: bytes.NewReader(content)}, nil
|
||||
}
|
||||
|
||||
func generateKubeOutput(podYAML *k8sAPI.Pod, serviceYAML *k8sAPI.Service) ([]byte, error) {
|
||||
func generateKubeOutput(podYAML *k8sAPI.Pod, serviceYAML *k8sAPI.Service, hasService bool) ([]byte, error) {
|
||||
var (
|
||||
output []byte
|
||||
marshalledPod []byte
|
||||
@@ -93,7 +113,7 @@ func generateKubeOutput(podYAML *k8sAPI.Pod, serviceYAML *k8sAPI.Service) ([]byt
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if serviceYAML != nil {
|
||||
if hasService {
|
||||
marshalledService, err = yaml.Marshal(serviceYAML)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -114,7 +134,7 @@ func generateKubeOutput(podYAML *k8sAPI.Pod, serviceYAML *k8sAPI.Service) ([]byt
|
||||
|
||||
output = append(output, []byte(fmt.Sprintf(header, podmanVersion.Version))...)
|
||||
output = append(output, marshalledPod...)
|
||||
if serviceYAML != nil {
|
||||
if hasService {
|
||||
output = append(output, []byte("---\n")...)
|
||||
output = append(output, marshalledService...)
|
||||
}
|
||||
|
||||
@@ -11,6 +11,6 @@ func (ic *ContainerEngine) GenerateSystemd(ctx context.Context, nameOrID string,
|
||||
return generate.Systemd(ic.ClientCxt, nameOrID, options)
|
||||
}
|
||||
|
||||
func (ic *ContainerEngine) GenerateKube(ctx context.Context, nameOrID string, options entities.GenerateKubeOptions) (*entities.GenerateKubeReport, error) {
|
||||
return generate.Kube(ic.ClientCxt, nameOrID, options)
|
||||
func (ic *ContainerEngine) GenerateKube(ctx context.Context, nameOrIDs []string, options entities.GenerateKubeOptions) (*entities.GenerateKubeReport, error) {
|
||||
return generate.Kube(ic.ClientCxt, nameOrIDs, options)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user