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.
215 lines
6.8 KiB
215 lines
6.8 KiB
9 years ago
|
/*
|
||
|
Copyright 2016 The Kubernetes Authors All rights reserved.
|
||
|
|
||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
you may not use this file except in compliance with the License.
|
||
|
You may obtain a copy of the License at
|
||
|
|
||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||
|
|
||
|
Unless required by applicable law or agreed to in writing, software
|
||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
See the License for the specific language governing permissions and
|
||
|
limitations under the License.
|
||
|
*/
|
||
|
|
||
9 years ago
|
/*Package environment describes the operating environment for Tiller.
|
||
|
|
||
|
Tiller's environment encapsulates all of the service dependencies Tiller has.
|
||
|
These dependencies are expressed as interfaces so that alternate implementations
|
||
|
(mocks, etc.) can be easily generated.
|
||
|
*/
|
||
9 years ago
|
package environment
|
||
|
|
||
|
import (
|
||
9 years ago
|
"io"
|
||
|
|
||
9 years ago
|
"k8s.io/helm/pkg/chartutil"
|
||
9 years ago
|
"k8s.io/helm/pkg/engine"
|
||
|
"k8s.io/helm/pkg/kube"
|
||
|
"k8s.io/helm/pkg/proto/hapi/chart"
|
||
|
"k8s.io/helm/pkg/storage"
|
||
8 years ago
|
"k8s.io/helm/pkg/storage/driver"
|
||
8 years ago
|
"k8s.io/kubernetes/pkg/client/unversioned"
|
||
8 years ago
|
"k8s.io/kubernetes/pkg/client/unversioned/testclient"
|
||
9 years ago
|
)
|
||
|
|
||
8 years ago
|
// TillerNamespace is the namespace tiller is running in.
|
||
8 years ago
|
const TillerNamespace = "kube-system"
|
||
|
|
||
9 years ago
|
// GoTplEngine is the name of the Go template engine, as registered in the EngineYard.
|
||
9 years ago
|
const GoTplEngine = "gotpl"
|
||
|
|
||
9 years ago
|
// DefaultEngine points to the engine that the EngineYard should treat as the
|
||
|
// default. A chart that does not specify an engine may be run through the
|
||
|
// default engine.
|
||
9 years ago
|
var DefaultEngine = GoTplEngine
|
||
|
|
||
9 years ago
|
// EngineYard maps engine names to engine implementations.
|
||
|
type EngineYard map[string]Engine
|
||
|
|
||
9 years ago
|
// Get retrieves a template engine by name.
|
||
|
//
|
||
|
// If no matching template engine is found, the second return value will
|
||
|
// be false.
|
||
9 years ago
|
func (y EngineYard) Get(k string) (Engine, bool) {
|
||
|
e, ok := y[k]
|
||
|
return e, ok
|
||
|
}
|
||
|
|
||
9 years ago
|
// Default returns the default template engine.
|
||
|
//
|
||
|
// The default is specified by DefaultEngine.
|
||
|
//
|
||
|
// If the default template engine cannot be found, this panics.
|
||
|
func (y EngineYard) Default() Engine {
|
||
|
d, ok := y[DefaultEngine]
|
||
|
if !ok {
|
||
|
// This is a developer error!
|
||
|
panic("Default template engine does not exist")
|
||
|
}
|
||
|
return d
|
||
|
}
|
||
|
|
||
9 years ago
|
// Engine represents a template engine that can render templates.
|
||
|
//
|
||
|
// For some engines, "rendering" includes both compiling and executing. (Other
|
||
|
// engines do not distinguish between phases.)
|
||
|
//
|
||
9 years ago
|
// The engine returns a map where the key is the named output entity (usually
|
||
|
// a file name) and the value is the rendered content of the template.
|
||
|
//
|
||
9 years ago
|
// An Engine must be capable of executing multiple concurrent requests, but
|
||
|
// without tainting one request's environment with data from another request.
|
||
|
type Engine interface {
|
||
9 years ago
|
// Render renders a chart.
|
||
|
//
|
||
|
// It receives a chart, a config, and a map of overrides to the config.
|
||
|
// Overrides are assumed to be passed from the system, not the user.
|
||
9 years ago
|
Render(*chart.Chart, chartutil.Values) (map[string]string, error)
|
||
9 years ago
|
}
|
||
|
|
||
|
// KubeClient represents a client capable of communicating with the Kubernetes API.
|
||
|
//
|
||
|
// A KubeClient must be concurrency safe.
|
||
|
type KubeClient interface {
|
||
9 years ago
|
// Create creates one or more resources.
|
||
|
//
|
||
|
// namespace must contain a valid existing namespace.
|
||
9 years ago
|
//
|
||
9 years ago
|
// reader must contain a YAML stream (one or more YAML documents separated
|
||
|
// by "\n---\n").
|
||
|
Create(namespace string, reader io.Reader) error
|
||
9 years ago
|
|
||
8 years ago
|
// Get gets one or more resources. Returned string hsa the format like kubectl
|
||
|
// provides with the column headers separating the resource types.
|
||
8 years ago
|
//
|
||
|
// namespace must contain a valid existing namespace.
|
||
|
//
|
||
|
// reader must contain a YAML stream (one or more YAML documents separated
|
||
|
// by "\n---\n").
|
||
|
Get(namespace string, reader io.Reader) (string, error)
|
||
|
|
||
9 years ago
|
// Delete destroys one or more resources.
|
||
|
//
|
||
|
// namespace must contain a valid existing namespace.
|
||
|
//
|
||
|
// reader must contain a YAML stream (one or more YAML documents separated
|
||
|
// by "\n---\n").
|
||
|
Delete(namespace string, reader io.Reader) error
|
||
8 years ago
|
|
||
|
// Watch the resource in reader until it is "ready".
|
||
|
//
|
||
|
// For Jobs, "ready" means the job ran to completion (excited without error).
|
||
|
// For all other kinds, it means the kind was created or modified without
|
||
|
// error.
|
||
|
WatchUntilReady(namespace string, reader io.Reader) error
|
||
8 years ago
|
|
||
|
// Update updates one or more resources or creates the resource
|
||
|
// if it doesn't exist
|
||
|
//
|
||
|
// namespace must contain a valid existing namespace
|
||
|
//
|
||
|
// reader must contain a YAML stream (one or more YAML documents separated
|
||
|
// by "\n---\n").
|
||
|
Update(namespace string, originalReader, modifiedReader io.Reader) error
|
||
8 years ago
|
|
||
|
// APIClient gets a raw API client for Kubernetes.
|
||
|
APIClient() (unversioned.Interface, error)
|
||
9 years ago
|
}
|
||
|
|
||
|
// PrintingKubeClient implements KubeClient, but simply prints the reader to
|
||
|
// the given output.
|
||
|
type PrintingKubeClient struct {
|
||
|
Out io.Writer
|
||
|
}
|
||
|
|
||
8 years ago
|
// APIClient always returns an error.
|
||
|
//
|
||
|
// The printing client does not have access to a Kubernetes client at all. So it
|
||
|
// will always return an error if the client is accessed.
|
||
|
func (p *PrintingKubeClient) APIClient() (unversioned.Interface, error) {
|
||
8 years ago
|
return testclient.NewSimpleFake(), nil
|
||
8 years ago
|
}
|
||
|
|
||
9 years ago
|
// Create prints the values of what would be created with a real KubeClient.
|
||
|
func (p *PrintingKubeClient) Create(ns string, r io.Reader) error {
|
||
|
_, err := io.Copy(p.Out, r)
|
||
|
return err
|
||
9 years ago
|
}
|
||
9 years ago
|
|
||
8 years ago
|
// Get prints the values of what would be created with a real KubeClient.
|
||
|
func (p *PrintingKubeClient) Get(ns string, r io.Reader) (string, error) {
|
||
|
_, err := io.Copy(p.Out, r)
|
||
|
return "", err
|
||
|
}
|
||
|
|
||
9 years ago
|
// Delete implements KubeClient delete.
|
||
|
//
|
||
|
// It only prints out the content to be deleted.
|
||
9 years ago
|
func (p *PrintingKubeClient) Delete(ns string, r io.Reader) error {
|
||
|
_, err := io.Copy(p.Out, r)
|
||
|
return err
|
||
|
}
|
||
9 years ago
|
|
||
8 years ago
|
// WatchUntilReady implements KubeClient WatchUntilReady.
|
||
|
func (p *PrintingKubeClient) WatchUntilReady(ns string, r io.Reader) error {
|
||
|
_, err := io.Copy(p.Out, r)
|
||
|
return err
|
||
|
}
|
||
|
|
||
8 years ago
|
// Update implements KubeClient Update.
|
||
|
func (p *PrintingKubeClient) Update(ns string, currentReader, modifiedReader io.Reader) error {
|
||
|
_, err := io.Copy(p.Out, modifiedReader)
|
||
|
return err
|
||
|
}
|
||
|
|
||
9 years ago
|
// Environment provides the context for executing a client request.
|
||
|
//
|
||
|
// All services in a context are concurrency safe.
|
||
|
type Environment struct {
|
||
|
// EngineYard provides access to the known template engines.
|
||
|
EngineYard EngineYard
|
||
|
// Releases stores records of releases.
|
||
8 years ago
|
Releases *storage.Storage
|
||
9 years ago
|
// KubeClient is a Kubernetes API client.
|
||
|
KubeClient KubeClient
|
||
|
}
|
||
|
|
||
|
// New returns an environment initialized with the defaults.
|
||
|
func New() *Environment {
|
||
9 years ago
|
e := engine.New()
|
||
9 years ago
|
var ey EngineYard = map[string]Engine{
|
||
|
// Currently, the only template engine we support is the GoTpl one. But
|
||
|
// we can easily add some here.
|
||
|
GoTplEngine: e,
|
||
|
}
|
||
8 years ago
|
|
||
9 years ago
|
return &Environment{
|
||
|
EngineYard: ey,
|
||
8 years ago
|
Releases: storage.Init(driver.NewMemory()),
|
||
|
KubeClient: kube.New(nil),
|
||
9 years ago
|
}
|
||
9 years ago
|
}
|