// uploadManifests sends manifests to Kubectl in a particular order. func uploadManifests(c *chart.Chart, namespace string, client kubectl.Runner) error { // Install known kinds in a predictable order. for _, k := range InstallOrder { for _, m := range c.Kind[k] { o := m.VersionedObject o.AddAnnotations(map[string]string{ chart.AnnFile: m.Source, chart.AnnChartVersion: c.Chartfile.Version, chart.AnnChartDesc: c.Chartfile.Description, chart.AnnChartName: c.Chartfile.Name, }) var data []byte var err error if data, err = o.JSON(); err != nil { return err } var action = client.Create // If it's a keeper manifest, do "kubectl apply" instead of "create." if manifest.IsKeeper(data) { action = client.Apply } log.Debug("File: %s", string(data)) out, err := action(data, namespace) log.Msg(string(out)) if err != nil { return err } } } // Install unknown kinds afterward. Order here is not predictable. for _, k := range c.UnknownKinds(InstallOrder) { for _, o := range c.Kind[k] { o.VersionedObject.AddAnnotations(map[string]string{chart.AnnFile: o.Source}) data, err := o.VersionedObject.JSON() if err != nil { return err } out, err := client.Create(data, namespace) log.Msg(string(out)) if err != nil { return err } } } return nil }
func uninstallKind(kind []*manifest.Manifest, ns, ktype string, dry bool, client kubectl.Runner) { for _, o := range kind { if dry { log.Msg("%s/%s", ktype, o.Name) } else { // If it's a keeper manifest, skip uninstall. if data, err := o.VersionedObject.JSON(); err == nil { if manifest.IsKeeper(data) { log.Warn("Not uninstalling %s %s because of \"helm-keep\" annotation.\n"+ "---> Use kubectl to uninstall keeper manifests.\n", ktype, o.Name) continue } } out, err := client.Delete(o.Name, ktype, ns) if err != nil { log.Warn("Could not delete %s %s (Skipping): %s", ktype, o.Name, err) } log.Info(string(out)) } } }