mirror of https://github.com/helm/helm
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
204 lines
4.9 KiB
204 lines
4.9 KiB
package deploy
|
|
|
|
import (
|
|
//"archive/tar"
|
|
//"errors"
|
|
//"fmt"
|
|
"os"
|
|
//"strings"
|
|
|
|
//"github.com/ghodss/yaml"
|
|
"github.com/kubernetes/deployment-manager/chart"
|
|
"github.com/kubernetes/deployment-manager/common"
|
|
//"github.com/kubernetes/deployment-manager/expandybird/expander"
|
|
//"github.com/kubernetes/deployment-manager/registry"
|
|
)
|
|
|
|
// Deployer is capable of deploying an object to a back-end.
|
|
type Deployer interface {
|
|
// Prepare prepares the local side of a deployment.
|
|
Prepare() error
|
|
|
|
// Commit pushes a deployment and checks that it is completed.
|
|
//
|
|
// This sends the data to the given host.
|
|
Commit(host string) error
|
|
}
|
|
|
|
// Deployment describes a deployment of a package.
|
|
type Deployment struct {
|
|
// Name is the Deployment name. Autogenerated if empty.
|
|
Name string
|
|
// Filename is the filename for the base deployment.
|
|
Filename string
|
|
// Imports is a list of imported files.
|
|
Imports []string
|
|
// Properties to pass into the template.
|
|
Properties map[string]interface{}
|
|
// Input is a file containing templates. It may be os.Stdin.
|
|
Input *os.File
|
|
// Repository is the location of the templates.
|
|
Repository string
|
|
|
|
// The template, typically generated by the Deployment.
|
|
Template *common.Template
|
|
|
|
lchart *chart.Chart
|
|
}
|
|
|
|
// Prepare loads templates and checks for client-side errors.
|
|
//
|
|
// This will generate the Template based on other information.
|
|
func (d *Deployment) Prepare() error {
|
|
|
|
// Is Filename a local dir, a local file, or a remote URL?
|
|
fi, err := os.Stat(d.Filename)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
var c *chart.Chart
|
|
if fi.IsDir() {
|
|
c, err = chart.LoadDir(d.Filename)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
} else {
|
|
c, err = chart.Load(d.Filename)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
// Override name if we need to
|
|
|
|
// Properties
|
|
|
|
d.lchart = c
|
|
return nil
|
|
}
|
|
|
|
// Chart retrieves the chart from teh deployment.
|
|
func (d *Deployment) Chart() *chart.Chart {
|
|
return d.lchart
|
|
}
|
|
|
|
// Commit prepares the Deployment and then commits it to the remote processor.
|
|
func (d *Deployment) Commit(host string) error {
|
|
return nil
|
|
}
|
|
|
|
/*
|
|
// resolveTemplate resolves what kind of template is being loaded, and then returns the template.
|
|
func (d *Deployment) resolveTemplate() (*common.Template, error) {
|
|
// If some input has been specified, read it.
|
|
if d.Input != nil {
|
|
// Assume this is a tar archive.
|
|
tpl, err := expander.NewTemplateFromArchive(d.Filename, d.Input, d.Imports)
|
|
if err == nil {
|
|
return tpl, err
|
|
} else if err != tar.ErrHeader {
|
|
return nil, err
|
|
}
|
|
|
|
// If we get here, the file is not a tar archive.
|
|
if _, err := os.Stdin.Seek(0, 0); err != nil {
|
|
return nil, err
|
|
}
|
|
return expander.NewTemplateFromReader(d.Filename, d.Input, d.Imports)
|
|
}
|
|
|
|
// Non-Stdin case
|
|
if len(d.Imports) > 0 {
|
|
if t, err := registryType(d.Filename); err != nil {
|
|
return expander.NewTemplateFromRootTemplate(d.Filename)
|
|
} else {
|
|
return buildTemplateFromType(t, d.Repository, d.Properties)
|
|
}
|
|
}
|
|
return expander.NewTemplateFromFileNames(d.Filename, d.Imports)
|
|
}
|
|
|
|
// registryType is a placeholder until registry.ParseType() is merged.
|
|
func registryType(name string) (*registry.Type, error) {
|
|
tList := strings.Split(name, ":")
|
|
if len(tList) != 2 {
|
|
return nil, errors.New("No version")
|
|
}
|
|
|
|
semver, err := registry.ParseSemVer(tList[1])
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
tt := registry.Type{Version: semver}
|
|
|
|
cList := strings.Split(tList[0], "/")
|
|
|
|
if len(cList) == 1 {
|
|
tt.Name = tList[0]
|
|
} else {
|
|
tt.Collection = cList[0]
|
|
tt.Name = cList[1]
|
|
}
|
|
return &tt, nil
|
|
}
|
|
|
|
// buildTemplateFromType is a straight lift-n-shift from dm.go.
|
|
func buildTemplateFromType(t *registry.Type, reg string, props map[string]interface{}) (*common.Template, error) {
|
|
// Name the deployment after the type name.
|
|
name := fmt.Sprintf("%s:%s", t.Name, t.Version)
|
|
git, err := getGitRegistry(reg)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
gurls, err := git.GetDownloadURLs(*t)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
config := common.Configuration{Resources: []*common.Resource{&common.Resource{
|
|
Name: name,
|
|
Type: gurls[0].Host,
|
|
Properties: props,
|
|
}}}
|
|
|
|
y, err := yaml.Marshal(config)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("error: %s\ncannot create configuration for deployment: %v\n", err, config)
|
|
}
|
|
|
|
return &common.Template{
|
|
Name: name,
|
|
Content: string(y),
|
|
// No imports, as this is a single type from repository.
|
|
}, nil
|
|
}
|
|
|
|
// getGitRegistry returns a registry object for a name.
|
|
func getGitRegistry(reg string) (registry.Registry, error) {
|
|
s := strings.SplitN(reg, "/", 3)
|
|
if len(s) < 2 {
|
|
return nil, fmt.Errorf("invalid template registry: %s", reg)
|
|
}
|
|
|
|
//path := ""
|
|
//if len(s) > 2 {
|
|
//path = s[3]
|
|
//}
|
|
|
|
if s[0] == "helm" {
|
|
r, err := registry.NewGithubPackageRegistry(s[0], s[1], nil, nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return r, nil
|
|
} else {
|
|
r, err := registry.NewGithubTemplateRegistry(s[0], s[1], nil, nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return r, nil
|
|
}
|
|
}
|
|
*/
|