func installTemplates(kc *k8sclient.Client, c *oclient.Client, fac *cmdutil.Factory, v string, templateUrl string, dockerRegistry string, arch string, domain string) error { ns, _, err := fac.DefaultNamespace() if err != nil { util.Fatal("No default namespace") return err } templates := c.Templates(ns) uri := fmt.Sprintf(templateUrl, v) util.Infof("Downloading apps from: %v\n", uri) resp, err := http.Get(uri) if err != nil { util.Fatalf("Cannot get fabric8 template to deploy: %v", err) } defer resp.Body.Close() tmpFileName := path.Join(os.TempDir(), "fabric8-template-distros.tar.gz") t, err := os.OpenFile(tmpFileName, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0777) if err != nil { return err } defer t.Close() _, err = io.Copy(t, resp.Body) if err != nil { return err } r, err := zip.OpenReader(tmpFileName) if err != nil { return err } defer r.Close() typeOfMaster := util.TypeOfMaster(kc) for _, f := range r.File { mode := f.FileHeader.Mode() if mode.IsDir() { continue } rc, err := f.Open() if err != nil { return err } defer rc.Close() jsonData, err := ioutil.ReadAll(rc) if err != nil { util.Fatalf("Cannot get fabric8 template to deploy: %v", err) } jsonData, err = adaptFabric8ImagesInResourceDescriptor(jsonData, dockerRegistry, arch) if err != nil { util.Fatalf("Cannot append docker registry: %v", err) } jsonData = replaceDomain(jsonData, domain, ns, typeOfMaster) var v1tmpl tapiv1.Template lowerName := strings.ToLower(f.Name) // if the folder starts with kubernetes/ or openshift/ then lets filter based on the cluster: if strings.HasPrefix(lowerName, "kubernetes/") && typeOfMaster != util.Kubernetes { //util.Info("Ignoring as on openshift!") continue } if strings.HasPrefix(lowerName, "openshift/") && typeOfMaster == util.Kubernetes { //util.Info("Ignoring as on kubernetes!") continue } configMapKeySuffix := ".json" if strings.HasSuffix(lowerName, ".yml") || strings.HasSuffix(lowerName, ".yaml") { configMapKeySuffix = ".yml" err = yaml.Unmarshal(jsonData, &v1tmpl) } else if strings.HasSuffix(lowerName, ".json") { err = json.Unmarshal(jsonData, &v1tmpl) } else { continue } if err != nil { util.Fatalf("Cannot unmarshall the fabric8 template %s to deploy: %v", f.Name, err) } util.Infof("Loading template %s\n", f.Name) var tmpl tapi.Template err = api.Scheme.Convert(&v1tmpl, &tmpl) if err != nil { util.Fatalf("Cannot get fabric8 template to deploy: %v", err) return err } name := tmpl.ObjectMeta.Name template := true if len(name) <= 0 { template = false name = f.Name idx := strings.LastIndex(name, "/") if idx > 0 { name = name[idx+1:] } idx = strings.Index(name, ".") if idx > 0 { name = name[0:idx] } } if typeOfMaster == util.Kubernetes { appName := name name = "catalog-" + appName // lets install ConfigMaps for the templates // TODO should the name have a prefix? configmap := api.ConfigMap{ ObjectMeta: api.ObjectMeta{ Name: name, Namespace: ns, Labels: map[string]string{ "name": appName, "provider": "fabric8.io", "kind": "catalog", }, }, Data: map[string]string{ name + configMapKeySuffix: string(jsonData), }, } configmaps := kc.ConfigMaps(ns) _, err = configmaps.Get(name) if err == nil { err = configmaps.Delete(name) if err != nil { util.Errorf("Could not delete configmap %s due to: %v\n", name, err) } } _, err = configmaps.Create(&configmap) if err != nil { util.Fatalf("Failed to create configmap %v", err) return err } } else { if !template { templateName := name var v1List v1.List if configMapKeySuffix == ".json" { err = json.Unmarshal(jsonData, &v1List) } else { err = yaml.Unmarshal(jsonData, &v1List) } if err != nil { util.Fatalf("Cannot unmarshal List %s to deploy. error: %v\ntemplate: %s", templateName, err, string(jsonData)) } if len(v1List.Items) == 0 { // lets check if its an RC / ReplicaSet or something _, groupVersionKind, err := api.Codecs.UniversalDeserializer().Decode(jsonData, nil, nil) if err != nil { printResult(templateName, Failure, err) } else { kind := groupVersionKind.Kind util.Infof("Processing resource of kind: %s version: %s\n", kind, groupVersionKind.Version) if len(kind) <= 0 { printResult(templateName, Failure, fmt.Errorf("Could not find kind from json %s", string(jsonData))) } else { util.Warnf("Cannot yet process kind %s, kind for %s\n", kind, templateName) continue } } } else { var kubeList api.List err = api.Scheme.Convert(&v1List, &kubeList) if err != nil { util.Fatalf("Cannot convert %s List to deploy: %v", templateName, err) } tmpl = tapi.Template{ ObjectMeta: api.ObjectMeta{ Name: name, Namespace: ns, Labels: map[string]string{ "name": name, "provider": "fabric8.io", }, }, Objects: kubeList.Items, } } } // remove newlines from description to avoid breaking `oc get template` description := tmpl.ObjectMeta.Annotations["description"] if len(description) > 0 { tmpl.ObjectMeta.Annotations["description"] = strings.Replace(description, "\n", " ", -1) } // lets install the OpenShift templates _, err = templates.Get(name) if err == nil { err = templates.Delete(name) if err != nil { util.Errorf("Could not delete template %s due to: %v\n", name, err) } } _, err = templates.Create(&tmpl) if err != nil { util.Warnf("Failed to create template %v", err) return err } } } return nil }
func runTemplate(c *k8sclient.Client, oc *oclient.Client, appToRun string, ns string, domain string, apiserver string, pv bool) { util.Info("\n\nInstalling: ") util.Successf("%s\n\n", appToRun) typeOfMaster := util.TypeOfMaster(c) if typeOfMaster == util.Kubernetes { jsonData, format, err := loadTemplateData(ns, appToRun, c, oc) if err != nil { printError("Failed to load app "+appToRun, err) } createTemplate(jsonData, format, appToRun, ns, domain, apiserver, c, oc, pv) } else { tmpl, err := oc.Templates(ns).Get(appToRun) if err != nil { printError("Failed to load template "+appToRun, err) } util.Infof("Loaded template with %d objects", len(tmpl.Objects)) processTemplate(tmpl, ns, domain, apiserver) objectCount := len(tmpl.Objects) util.Infof("Creating "+appToRun+" template resources from %d objects\n", objectCount) for _, o := range tmpl.Objects { err = processItem(c, oc, &o, ns, pv) } } }
func getTemplates(c *oclient.Client, ns string) *tapi.TemplateList { templates, err := c.Templates(ns).List(api.ListOptions{}) if err != nil { util.Fatalf("No Templates found in namespace %s\n", ns) } return templates }
func getTemplates(c *oclient.Client, ns string) *tapi.TemplateList { rc, err := c.Templates(ns).List(labels.Everything(), fields.Everything()) if err != nil { util.Fatalf("No Templates found in namespace %s\n", ns) } return rc }
func validateTemplates(c *oclient.Client, f *cmdutil.Factory) (Result, error) { ns, _, err := f.DefaultNamespace() if err != nil { return Failure, err } rc, err := c.Templates(ns).Get("management") if rc != nil { return Success, err } return Failure, err }
func downloadTemplateDockerImages(cmd *cobra.Command, ns string, c *oclient.Client, fac *cmdutil.Factory, name string) (Result, error) { rc, err := c.Templates(ns).Get(name) if err != nil { util.Fatalf("No Template %s found in namespace %s\n", name, ns) } // convert Template.Objects to Kubernetes resources _ = runtime.DecodeList(rc.Objects, api.Scheme, runtime.UnstructuredJSONScheme) for _, rc := range rc.Objects { switch rc := rc.(type) { case *api.ReplicationController: for _, container := range rc.Spec.Template.Spec.Containers { err = downloadDockerImage(container.Image) if err != nil { return Failure, err } } } } return Success, nil }
func installTemplates(kc *k8sclient.Client, c *oclient.Client, fac *cmdutil.Factory, v string, templateUrl string, dockerRegistry string, arch string, domain string) error { ns, _, err := fac.DefaultNamespace() if err != nil { util.Fatal("No default namespace") return err } templates := c.Templates(ns) util.Infof("Downloading templates for version %v\n", v) uri := fmt.Sprintf(templateUrl, v) resp, err := http.Get(uri) if err != nil { util.Fatalf("Cannot get fabric8 template to deploy: %v", err) } defer resp.Body.Close() tmpFileName := "/tmp/fabric8-template-distros.tar.gz" t, err := os.OpenFile(tmpFileName, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0777) if err != nil { return err } defer t.Close() _, err = io.Copy(t, resp.Body) if err != nil { return err } r, err := zip.OpenReader(tmpFileName) if err != nil { return err } defer r.Close() typeOfMaster := util.TypeOfMaster(kc) for _, f := range r.File { mode := f.FileHeader.Mode() if mode.IsDir() { continue } rc, err := f.Open() if err != nil { return err } defer rc.Close() util.Infof("Loading template %s\n", f.Name) jsonData, err := ioutil.ReadAll(rc) if err != nil { util.Fatalf("Cannot get fabric8 template to deploy: %v", err) } jsonData, err = adaptFabric8ImagesInResourceDescriptor(jsonData, dockerRegistry, arch) if err != nil { util.Fatalf("Cannot append docker registry: %v", err) } jsonData = replaceDomain(jsonData, domain, ns, typeOfMaster) var v1tmpl tapiv1.Template err = json.Unmarshal(jsonData, &v1tmpl) if err != nil { util.Fatalf("Cannot get fabric8 template to deploy: %v", err) } var tmpl tapi.Template err = api.Scheme.Convert(&v1tmpl, &tmpl) if err != nil { util.Fatalf("Cannot get fabric8 template to deploy: %v", err) return err } name := tmpl.ObjectMeta.Name if typeOfMaster == util.Kubernetes { appName := name name = "catalog-" + appName // lets install ConfigMaps for the templates // TODO should the name have a prefix? configmap := api.ConfigMap{ ObjectMeta: api.ObjectMeta{ Name: name, Namespace: ns, Labels: map[string]string{ "name": appName, "provider": "fabric8.io", "kind": "catalog", }, }, Data: map[string]string{ name + ".json": string(jsonData), }, } configmaps := kc.ConfigMaps(ns) _, err = configmaps.Get(name) if err == nil { err = configmaps.Delete(name) if err != nil { util.Errorf("Could not delete configmap %s due to: %v\n", name, err) } } _, err = configmaps.Create(&configmap) if err != nil { util.Fatalf("Failed to create configmap %v", err) return err } } else { // lets install the OpenShift templates _, err = templates.Get(name) if err == nil { err = templates.Delete(name) if err != nil { util.Errorf("Could not delete template %s due to: %v\n", name, err) } } _, err = templates.Create(&tmpl) if err != nil { util.Fatalf("Failed to create template %v", err) return err } } } return nil }
func installTemplates(c *oclient.Client, fac *cmdutil.Factory, v string, templateUrl string) error { ns, _, err := fac.DefaultNamespace() if err != nil { util.Fatal("No default namespace") return err } templates := c.Templates(ns) util.Infof("Downloading templates for version %v\n", v) uri := fmt.Sprintf(templateUrl, v) resp, err := http.Get(uri) if err != nil { util.Fatalf("Cannot get fabric8 template to deploy: %v", err) } defer resp.Body.Close() tmpFileName := "/tmp/fabric8-template-distros.tar.gz" t, err := os.OpenFile(tmpFileName, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0777) if err != nil { return err } defer t.Close() _, err = io.Copy(t, resp.Body) if err != nil { return err } r, err := zip.OpenReader(tmpFileName) if err != nil { return err } defer r.Close() for _, f := range r.File { mode := f.FileHeader.Mode() if mode.IsDir() { continue } rc, err := f.Open() if err != nil { return err } defer rc.Close() util.Infof("Loading template %s\n", f.Name) jsonData, err := ioutil.ReadAll(rc) if err != nil { util.Fatalf("Cannot get fabric8 template to deploy: %v", err) } var v1tmpl tapiv1.Template err = json.Unmarshal(jsonData, &v1tmpl) if err != nil { util.Fatalf("Cannot get fabric8 template to deploy: %v", err) } var tmpl tapi.Template err = api.Scheme.Convert(&v1tmpl, &tmpl) if err != nil { util.Fatalf("Cannot get fabric8 template to deploy: %v", err) return err } name := tmpl.ObjectMeta.Name _, err = templates.Get(name) if err == nil { err = templates.Delete(name) if err != nil { util.Errorf("Could not delete template %s due to: %v\n", name, err) } } _, err = templates.Create(&tmpl) if err != nil { util.Fatalf("Failed to create template %v", err) return err } } return nil }
func loadTemplateData(ns string, templateName string, c *k8sclient.Client, oc *oclient.Client) ([]byte, string, error) { typeOfMaster := util.TypeOfMaster(c) if typeOfMaster == util.Kubernetes { catalogName := "catalog-" + templateName configMap, err := c.ConfigMaps(ns).Get(catalogName) if err != nil { return nil, "", err } for k, v := range configMap.Data { if strings.LastIndex(k, ".json") >= 0 { return []byte(v), "json", nil } if strings.LastIndex(k, ".yml") >= 0 || strings.LastIndex(k, ".yaml") >= 0 { return []byte(v), "yaml", nil } } return nil, "", fmt.Errorf("Could not find a key for the catalog %s which ends with `.json` or `.yml`", catalogName) } else { template, err := oc.Templates(ns).Get(templateName) if err != nil { return nil, "", err } data, err := json.Marshal(template) return data, "json", err } return nil, "", nil }