mirror of https://github.com/helm/helm
parent
7fde06438f
commit
0fbc9229cd
@ -0,0 +1,69 @@
|
|||||||
|
package kube
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
|
||||||
|
"k8s.io/kubernetes/pkg/client/unversioned/clientcmd"
|
||||||
|
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
|
||||||
|
"k8s.io/kubernetes/pkg/kubectl/resource"
|
||||||
|
)
|
||||||
|
|
||||||
|
const includeThirdPartyAPIs = false
|
||||||
|
|
||||||
|
// ResourceActorFunc performs an action on a signle resource.
|
||||||
|
type ResourceActorFunc func(*resource.Info) error
|
||||||
|
|
||||||
|
// Create creates kubernetes resources from an io.reader
|
||||||
|
//
|
||||||
|
// Namespace will set the namespace
|
||||||
|
// Config allows for overiding values from kubectl
|
||||||
|
func Create(namespace string, reader io.Reader, config clientcmd.ClientConfig) error {
|
||||||
|
return perform(namespace, reader, createResource, config)
|
||||||
|
}
|
||||||
|
|
||||||
|
func perform(namespace string, reader io.Reader, fn ResourceActorFunc, config clientcmd.ClientConfig) error {
|
||||||
|
f := cmdutil.NewFactory(config)
|
||||||
|
//schema, err := f.Validator(true, "")
|
||||||
|
//if err != nil {
|
||||||
|
//return err
|
||||||
|
//}
|
||||||
|
|
||||||
|
r := f.NewBuilder(includeThirdPartyAPIs).
|
||||||
|
ContinueOnError().
|
||||||
|
NamespaceParam(namespace).
|
||||||
|
RequireNamespace().
|
||||||
|
Stream(reader, "").
|
||||||
|
Flatten().
|
||||||
|
Do()
|
||||||
|
|
||||||
|
if r.Err() != nil {
|
||||||
|
return r.Err()
|
||||||
|
}
|
||||||
|
|
||||||
|
count := 0
|
||||||
|
err := r.Visit(func(info *resource.Info, err error) error {
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = fn(info)
|
||||||
|
|
||||||
|
if err == nil {
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if count == 0 {
|
||||||
|
return fmt.Errorf("no objects passed to create")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func createResource(info *resource.Info) error {
|
||||||
|
_, err := resource.NewHelper(info.Client, info.Mapping).Create(info.Namespace, true, info.Object)
|
||||||
|
return err
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
package kube
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"k8s.io/kubernetes/pkg/kubectl/resource"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPerform(t *testing.T) {
|
||||||
|
f, err := os.Open("./testdata/guestbook-all-in-one.yaml")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
|
||||||
|
results := []*resource.Info{}
|
||||||
|
|
||||||
|
fn := func(info *resource.Info) error {
|
||||||
|
results = append(results, info)
|
||||||
|
|
||||||
|
if info.Namespace != "test" {
|
||||||
|
t.Errorf("expected namespace to be 'test', got %s", info.Namespace)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := perform("test", f, fn, nil); err != nil {
|
||||||
|
t.Fatalf("Unexpected error: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(results) != 6 {
|
||||||
|
t.Errorf("expected 6 result objects, got %d", len(results))
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,179 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: redis-master
|
||||||
|
labels:
|
||||||
|
app: redis
|
||||||
|
tier: backend
|
||||||
|
role: master
|
||||||
|
spec:
|
||||||
|
ports:
|
||||||
|
# the port that this service should serve on
|
||||||
|
- port: 6379
|
||||||
|
targetPort: 6379
|
||||||
|
selector:
|
||||||
|
app: redis
|
||||||
|
tier: backend
|
||||||
|
role: master
|
||||||
|
---
|
||||||
|
apiVersion: extensions/v1beta1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: redis-master
|
||||||
|
# these labels can be applied automatically
|
||||||
|
# from the labels in the pod template if not set
|
||||||
|
# labels:
|
||||||
|
# app: redis
|
||||||
|
# role: master
|
||||||
|
# tier: backend
|
||||||
|
spec:
|
||||||
|
# this replicas value is default
|
||||||
|
# modify it according to your case
|
||||||
|
replicas: 1
|
||||||
|
# selector can be applied automatically
|
||||||
|
# from the labels in the pod template if not set
|
||||||
|
# selector:
|
||||||
|
# matchLabels:
|
||||||
|
# app: guestbook
|
||||||
|
# role: master
|
||||||
|
# tier: backend
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: redis
|
||||||
|
role: master
|
||||||
|
tier: backend
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: master
|
||||||
|
image: gcr.io/google_containers/redis:e2e # or just image: redis
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
cpu: 100m
|
||||||
|
memory: 100Mi
|
||||||
|
ports:
|
||||||
|
- containerPort: 6379
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: redis-slave
|
||||||
|
labels:
|
||||||
|
app: redis
|
||||||
|
tier: backend
|
||||||
|
role: slave
|
||||||
|
spec:
|
||||||
|
ports:
|
||||||
|
# the port that this service should serve on
|
||||||
|
- port: 6379
|
||||||
|
selector:
|
||||||
|
app: redis
|
||||||
|
tier: backend
|
||||||
|
role: slave
|
||||||
|
---
|
||||||
|
apiVersion: extensions/v1beta1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: redis-slave
|
||||||
|
# these labels can be applied automatically
|
||||||
|
# from the labels in the pod template if not set
|
||||||
|
# labels:
|
||||||
|
# app: redis
|
||||||
|
# role: slave
|
||||||
|
# tier: backend
|
||||||
|
spec:
|
||||||
|
# this replicas value is default
|
||||||
|
# modify it according to your case
|
||||||
|
replicas: 2
|
||||||
|
# selector can be applied automatically
|
||||||
|
# from the labels in the pod template if not set
|
||||||
|
# selector:
|
||||||
|
# matchLabels:
|
||||||
|
# app: guestbook
|
||||||
|
# role: slave
|
||||||
|
# tier: backend
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: redis
|
||||||
|
role: slave
|
||||||
|
tier: backend
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: slave
|
||||||
|
image: gcr.io/google_samples/gb-redisslave:v1
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
cpu: 100m
|
||||||
|
memory: 100Mi
|
||||||
|
env:
|
||||||
|
- name: GET_HOSTS_FROM
|
||||||
|
value: dns
|
||||||
|
# If your cluster config does not include a dns service, then to
|
||||||
|
# instead access an environment variable to find the master
|
||||||
|
# service's host, comment out the 'value: dns' line above, and
|
||||||
|
# uncomment the line below.
|
||||||
|
# value: env
|
||||||
|
ports:
|
||||||
|
- containerPort: 6379
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: frontend
|
||||||
|
labels:
|
||||||
|
app: guestbook
|
||||||
|
tier: frontend
|
||||||
|
spec:
|
||||||
|
# if your cluster supports it, uncomment the following to automatically create
|
||||||
|
# an external load-balanced IP for the frontend service.
|
||||||
|
# type: LoadBalancer
|
||||||
|
ports:
|
||||||
|
# the port that this service should serve on
|
||||||
|
- port: 80
|
||||||
|
selector:
|
||||||
|
app: guestbook
|
||||||
|
tier: frontend
|
||||||
|
---
|
||||||
|
apiVersion: extensions/v1beta1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: frontend
|
||||||
|
# these labels can be applied automatically
|
||||||
|
# from the labels in the pod template if not set
|
||||||
|
# labels:
|
||||||
|
# app: guestbook
|
||||||
|
# tier: frontend
|
||||||
|
spec:
|
||||||
|
# this replicas value is default
|
||||||
|
# modify it according to your case
|
||||||
|
replicas: 3
|
||||||
|
# selector can be applied automatically
|
||||||
|
# from the labels in the pod template if not set
|
||||||
|
# selector:
|
||||||
|
# matchLabels:
|
||||||
|
# app: guestbook
|
||||||
|
# tier: frontend
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: guestbook
|
||||||
|
tier: frontend
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: php-redis
|
||||||
|
image: gcr.io/google-samples/gb-frontend:v4
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
cpu: 100m
|
||||||
|
memory: 100Mi
|
||||||
|
env:
|
||||||
|
- name: GET_HOSTS_FROM
|
||||||
|
value: dns
|
||||||
|
# If your cluster config does not include a dns service, then to
|
||||||
|
# instead access environment variables to find service host
|
||||||
|
# info, comment out the 'value: dns' line above, and uncomment the
|
||||||
|
# line below.
|
||||||
|
# value: env
|
||||||
|
ports:
|
||||||
|
- containerPort: 80
|
Loading…
Reference in new issue