mirror of https://github.com/kubernetes/kops.git
Add conversion tests, and fix some problems
* We were naming our etcd zones inconsistently * When we wrote to v1alpha2, we would change the etc member names Fix #1202
This commit is contained in:
parent
34aaa37f7c
commit
53135fa57e
1
Makefile
1
Makefile
|
@ -79,6 +79,7 @@ test:
|
||||||
go test k8s.io/kops/protokube/... -args -v=1 -logtostderr
|
go test k8s.io/kops/protokube/... -args -v=1 -logtostderr
|
||||||
go test k8s.io/kops/dns-controller/pkg/... -args -v=1 -logtostderr
|
go test k8s.io/kops/dns-controller/pkg/... -args -v=1 -logtostderr
|
||||||
go test k8s.io/kops/cmd/... -args -v=1 -logtostderr
|
go test k8s.io/kops/cmd/... -args -v=1 -logtostderr
|
||||||
|
go test k8s.io/kops/tests/... -args -v=1 -logtostderr
|
||||||
|
|
||||||
crossbuild-nodeup:
|
crossbuild-nodeup:
|
||||||
mkdir -p .build/dist/
|
mkdir -p .build/dist/
|
||||||
|
|
|
@ -332,7 +332,13 @@ func RunCreateCluster(f *util.Factory, out io.Writer, c *CreateClusterOptions) e
|
||||||
for _, masterName := range masterNames {
|
for _, masterName := range masterNames {
|
||||||
ig := masterInstanceGroups[masterName]
|
ig := masterInstanceGroups[masterName]
|
||||||
m := &api.EtcdMemberSpec{}
|
m := &api.EtcdMemberSpec{}
|
||||||
m.Name = ig.ObjectMeta.Name
|
|
||||||
|
name := ig.ObjectMeta.Name
|
||||||
|
// We expect the IG to have a `master-` prefix, but this is both superfluous
|
||||||
|
// and not how we named things previously
|
||||||
|
name = strings.TrimPrefix(name, "master-")
|
||||||
|
m.Name = name
|
||||||
|
|
||||||
m.InstanceGroup = fi.String(ig.ObjectMeta.Name)
|
m.InstanceGroup = fi.String(ig.ObjectMeta.Name)
|
||||||
etcd.Members = append(etcd.Members, m)
|
etcd.Members = append(etcd.Members, m)
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,6 +34,7 @@ k8s.io/kops/pkg/model/resources
|
||||||
k8s.io/kops/pkg/validation
|
k8s.io/kops/pkg/validation
|
||||||
k8s.io/kops/protokube/cmd/protokube
|
k8s.io/kops/protokube/cmd/protokube
|
||||||
k8s.io/kops/protokube/pkg/protokube
|
k8s.io/kops/protokube/pkg/protokube
|
||||||
|
k8s.io/kops/tests/integration/conversion
|
||||||
k8s.io/kops/upup/models
|
k8s.io/kops/upup/models
|
||||||
k8s.io/kops/upup/pkg/fi
|
k8s.io/kops/upup/pkg/fi
|
||||||
k8s.io/kops/upup/pkg/fi/cloudup
|
k8s.io/kops/upup/pkg/fi/cloudup
|
||||||
|
|
|
@ -217,7 +217,6 @@ func Convert_kops_EtcdMemberSpec_To_v1alpha1_EtcdMemberSpec(in *kops.EtcdMemberS
|
||||||
}
|
}
|
||||||
zone = strings.TrimPrefix(zone, "master-")
|
zone = strings.TrimPrefix(zone, "master-")
|
||||||
out.Zone = &zone
|
out.Zone = &zone
|
||||||
out.Name = zone
|
|
||||||
} else {
|
} else {
|
||||||
out.Zone = nil
|
out.Zone = nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,117 @@
|
||||||
|
/*
|
||||||
|
Copyright 2016 The Kubernetes Authors.
|
||||||
|
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"io/ioutil"
|
||||||
|
"k8s.io/kops/pkg/apis/kops"
|
||||||
|
"k8s.io/kops/pkg/apis/kops/v1alpha1"
|
||||||
|
"k8s.io/kops/pkg/apis/kops/v1alpha2"
|
||||||
|
"k8s.io/kops/pkg/diff"
|
||||||
|
k8sapi "k8s.io/kubernetes/pkg/api"
|
||||||
|
"k8s.io/kubernetes/pkg/runtime"
|
||||||
|
"k8s.io/kubernetes/pkg/runtime/schema"
|
||||||
|
"path"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
_ "k8s.io/kops/pkg/apis/kops/install"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// TestMinimal runs the test on a minimum configuration, similar to kops create cluster minimal.example.com --zones us-west-1a
|
||||||
|
func TestMinimal(t *testing.T) {
|
||||||
|
runTest(t, "minimal", "v1alpha1", "v1alpha2")
|
||||||
|
runTest(t, "minimal", "v1alpha2", "v1alpha1")
|
||||||
|
|
||||||
|
runTest(t, "minimal", "v1alpha0", "v1alpha1")
|
||||||
|
runTest(t, "minimal", "v1alpha0", "v1alpha2")
|
||||||
|
}
|
||||||
|
|
||||||
|
func runTest(t *testing.T, srcDir string, fromVersion string, toVersion string) {
|
||||||
|
sourcePath := path.Join(srcDir, fromVersion+".yaml")
|
||||||
|
sourceBytes, err := ioutil.ReadFile(sourcePath)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("unexpected error reading sourcePath %q: %v", sourcePath, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
expectedPath := path.Join(srcDir, toVersion+".yaml")
|
||||||
|
expectedBytes, err := ioutil.ReadFile(expectedPath)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("unexpected error reading expectedPath %q: %v", expectedPath, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
codec := k8sapi.Codecs.UniversalDecoder(kops.SchemeGroupVersion)
|
||||||
|
|
||||||
|
defaults := &schema.GroupVersionKind{
|
||||||
|
Group: v1alpha1.SchemeGroupVersion.Group,
|
||||||
|
Version: v1alpha1.SchemeGroupVersion.Version,
|
||||||
|
}
|
||||||
|
|
||||||
|
yaml, ok := runtime.SerializerInfoForMediaType(k8sapi.Codecs.SupportedMediaTypes(), "application/yaml")
|
||||||
|
if !ok {
|
||||||
|
t.Fatalf("no YAML serializer registered")
|
||||||
|
}
|
||||||
|
var encoder runtime.Encoder
|
||||||
|
|
||||||
|
switch toVersion {
|
||||||
|
case "v1alpha1":
|
||||||
|
encoder = k8sapi.Codecs.EncoderForVersion(yaml.Serializer, v1alpha1.SchemeGroupVersion)
|
||||||
|
case "v1alpha2":
|
||||||
|
encoder = k8sapi.Codecs.EncoderForVersion(yaml.Serializer, v1alpha2.SchemeGroupVersion)
|
||||||
|
|
||||||
|
default:
|
||||||
|
t.Fatalf("unknown version %q", toVersion)
|
||||||
|
}
|
||||||
|
|
||||||
|
//decoder := k8sapi.Codecs.DecoderToVersion(yaml.Serializer, kops.SchemeGroupVersion)
|
||||||
|
|
||||||
|
var actual []string
|
||||||
|
|
||||||
|
for _, s := range strings.Split(string(sourceBytes), "\n---\n") {
|
||||||
|
o, gvk, err := codec.Decode([]byte(s), defaults, nil)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("error parsing file %q: %v", sourcePath, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
expectVersion := fromVersion
|
||||||
|
if expectVersion == "v1alpha0" {
|
||||||
|
// Our version before we had v1alpha1
|
||||||
|
expectVersion = "v1alpha1"
|
||||||
|
}
|
||||||
|
if gvk.Version != expectVersion {
|
||||||
|
t.Fatalf("unexpected version: %q vs %q", gvk.Version, expectVersion)
|
||||||
|
}
|
||||||
|
|
||||||
|
var b bytes.Buffer
|
||||||
|
if err := encoder.Encode(o, &b); err != nil {
|
||||||
|
t.Fatalf("error encoding object: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
actual = append(actual, b.String())
|
||||||
|
}
|
||||||
|
|
||||||
|
actualString := strings.TrimSpace(strings.Join(actual, "\n---\n\n"))
|
||||||
|
expectedString := strings.TrimSpace(string(expectedBytes))
|
||||||
|
|
||||||
|
if actualString != expectedString {
|
||||||
|
diffString := diff.FormatDiff(expectedString, actualString)
|
||||||
|
t.Logf("diff:\n%s\n", diffString)
|
||||||
|
|
||||||
|
t.Fatalf("converted output differed from expected")
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,73 @@
|
||||||
|
kind: Cluster
|
||||||
|
metadata:
|
||||||
|
creationTimestamp: "2016-12-10T22:42:27Z"
|
||||||
|
name: minimal.example.com
|
||||||
|
spec:
|
||||||
|
adminAccess:
|
||||||
|
- 0.0.0.0/0
|
||||||
|
channel: stable
|
||||||
|
cloudProvider: aws
|
||||||
|
configBase: memfs://clusters.example.com/minimal.example.com
|
||||||
|
etcdClusters:
|
||||||
|
- etcdMembers:
|
||||||
|
- name: us-test-1a
|
||||||
|
zone: us-test-1a
|
||||||
|
name: main
|
||||||
|
- etcdMembers:
|
||||||
|
- name: us-test-1a
|
||||||
|
zone: us-test-1a
|
||||||
|
name: events
|
||||||
|
kubernetesVersion: v1.4.6
|
||||||
|
masterInternalName: api.internal.minimal.example.com
|
||||||
|
masterPublicName: api.minimal.example.com
|
||||||
|
networkCIDR: 172.20.0.0/16
|
||||||
|
networking:
|
||||||
|
kubenet: {}
|
||||||
|
nonMasqueradeCIDR: 100.64.0.0/10
|
||||||
|
topology:
|
||||||
|
bastion:
|
||||||
|
idleTimeout: 120
|
||||||
|
machineType: t2.medium
|
||||||
|
masters: public
|
||||||
|
nodes: public
|
||||||
|
zones:
|
||||||
|
- cidr: 172.20.32.0/19
|
||||||
|
name: us-test-1a
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
kind: InstanceGroup
|
||||||
|
metadata:
|
||||||
|
creationTimestamp: "2016-12-10T22:42:28Z"
|
||||||
|
name: nodes
|
||||||
|
labels:
|
||||||
|
kops.k8s.io/cluster: minimal.example.com
|
||||||
|
spec:
|
||||||
|
associatePublicIp: true
|
||||||
|
image: kope.io/k8s-1.4-debian-jessie-amd64-hvm-ebs-2016-10-21
|
||||||
|
machineType: t2.medium
|
||||||
|
maxSize: 2
|
||||||
|
minSize: 2
|
||||||
|
role: Node
|
||||||
|
zones:
|
||||||
|
- us-test-1a
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
kind: InstanceGroup
|
||||||
|
metadata:
|
||||||
|
creationTimestamp: "2016-12-10T22:42:28Z"
|
||||||
|
name: master-us-test-1a
|
||||||
|
labels:
|
||||||
|
kops.k8s.io/cluster: minimal.example.com
|
||||||
|
spec:
|
||||||
|
associatePublicIp: true
|
||||||
|
image: kope.io/k8s-1.4-debian-jessie-amd64-hvm-ebs-2016-10-21
|
||||||
|
machineType: m3.medium
|
||||||
|
maxSize: 1
|
||||||
|
minSize: 1
|
||||||
|
role: Master
|
||||||
|
zones:
|
||||||
|
- us-test-1a
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,75 @@
|
||||||
|
apiVersion: kops/v1alpha1
|
||||||
|
kind: Cluster
|
||||||
|
metadata:
|
||||||
|
creationTimestamp: "2016-12-10T22:42:27Z"
|
||||||
|
name: minimal.example.com
|
||||||
|
spec:
|
||||||
|
adminAccess:
|
||||||
|
- 0.0.0.0/0
|
||||||
|
api:
|
||||||
|
dns: {}
|
||||||
|
channel: stable
|
||||||
|
cloudProvider: aws
|
||||||
|
configBase: memfs://clusters.example.com/minimal.example.com
|
||||||
|
etcdClusters:
|
||||||
|
- etcdMembers:
|
||||||
|
- name: us-test-1a
|
||||||
|
zone: us-test-1a
|
||||||
|
name: main
|
||||||
|
- etcdMembers:
|
||||||
|
- name: us-test-1a
|
||||||
|
zone: us-test-1a
|
||||||
|
name: events
|
||||||
|
kubernetesVersion: v1.4.6
|
||||||
|
masterInternalName: api.internal.minimal.example.com
|
||||||
|
masterPublicName: api.minimal.example.com
|
||||||
|
networkCIDR: 172.20.0.0/16
|
||||||
|
networking:
|
||||||
|
kubenet: {}
|
||||||
|
nonMasqueradeCIDR: 100.64.0.0/10
|
||||||
|
topology:
|
||||||
|
masters: public
|
||||||
|
nodes: public
|
||||||
|
zones:
|
||||||
|
- cidr: 172.20.32.0/19
|
||||||
|
name: us-test-1a
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
apiVersion: kops/v1alpha1
|
||||||
|
kind: InstanceGroup
|
||||||
|
metadata:
|
||||||
|
creationTimestamp: "2016-12-10T22:42:28Z"
|
||||||
|
labels:
|
||||||
|
kops.k8s.io/cluster: minimal.example.com
|
||||||
|
name: nodes
|
||||||
|
spec:
|
||||||
|
associatePublicIp: true
|
||||||
|
image: kope.io/k8s-1.4-debian-jessie-amd64-hvm-ebs-2016-10-21
|
||||||
|
machineType: t2.medium
|
||||||
|
maxSize: 2
|
||||||
|
minSize: 2
|
||||||
|
role: Node
|
||||||
|
zones:
|
||||||
|
- us-test-1a
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
apiVersion: kops/v1alpha1
|
||||||
|
kind: InstanceGroup
|
||||||
|
metadata:
|
||||||
|
creationTimestamp: "2016-12-10T22:42:28Z"
|
||||||
|
labels:
|
||||||
|
kops.k8s.io/cluster: minimal.example.com
|
||||||
|
name: master-us-test-1a
|
||||||
|
spec:
|
||||||
|
associatePublicIp: true
|
||||||
|
image: kope.io/k8s-1.4-debian-jessie-amd64-hvm-ebs-2016-10-21
|
||||||
|
machineType: m3.medium
|
||||||
|
maxSize: 1
|
||||||
|
minSize: 1
|
||||||
|
role: Master
|
||||||
|
zones:
|
||||||
|
- us-test-1a
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,77 @@
|
||||||
|
apiVersion: kops/v1alpha2
|
||||||
|
kind: Cluster
|
||||||
|
metadata:
|
||||||
|
creationTimestamp: "2016-12-10T22:42:27Z"
|
||||||
|
name: minimal.example.com
|
||||||
|
spec:
|
||||||
|
api:
|
||||||
|
dns: {}
|
||||||
|
channel: stable
|
||||||
|
cloudProvider: aws
|
||||||
|
configBase: memfs://clusters.example.com/minimal.example.com
|
||||||
|
etcdClusters:
|
||||||
|
- etcdMembers:
|
||||||
|
- instanceGroup: master-us-test-1a
|
||||||
|
name: us-test-1a
|
||||||
|
name: main
|
||||||
|
- etcdMembers:
|
||||||
|
- instanceGroup: master-us-test-1a
|
||||||
|
name: us-test-1a
|
||||||
|
name: events
|
||||||
|
kubernetesApiAccess:
|
||||||
|
- 0.0.0.0/0
|
||||||
|
kubernetesVersion: v1.4.6
|
||||||
|
masterInternalName: api.internal.minimal.example.com
|
||||||
|
masterPublicName: api.minimal.example.com
|
||||||
|
networkCIDR: 172.20.0.0/16
|
||||||
|
networking:
|
||||||
|
kubenet: {}
|
||||||
|
nonMasqueradeCIDR: 100.64.0.0/10
|
||||||
|
sshAccess:
|
||||||
|
- 0.0.0.0/0
|
||||||
|
subnets:
|
||||||
|
- cidr: 172.20.32.0/19
|
||||||
|
name: us-test-1a
|
||||||
|
type: Public
|
||||||
|
zone: us-test-1a
|
||||||
|
topology:
|
||||||
|
masters: public
|
||||||
|
nodes: public
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
apiVersion: kops/v1alpha2
|
||||||
|
kind: InstanceGroup
|
||||||
|
metadata:
|
||||||
|
creationTimestamp: "2016-12-10T22:42:28Z"
|
||||||
|
labels:
|
||||||
|
kops.k8s.io/cluster: minimal.example.com
|
||||||
|
name: nodes
|
||||||
|
spec:
|
||||||
|
associatePublicIp: true
|
||||||
|
image: kope.io/k8s-1.4-debian-jessie-amd64-hvm-ebs-2016-10-21
|
||||||
|
machineType: t2.medium
|
||||||
|
maxSize: 2
|
||||||
|
minSize: 2
|
||||||
|
role: Node
|
||||||
|
subnets:
|
||||||
|
- us-test-1a
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
apiVersion: kops/v1alpha2
|
||||||
|
kind: InstanceGroup
|
||||||
|
metadata:
|
||||||
|
creationTimestamp: "2016-12-10T22:42:28Z"
|
||||||
|
labels:
|
||||||
|
kops.k8s.io/cluster: minimal.example.com
|
||||||
|
name: master-us-test-1a
|
||||||
|
spec:
|
||||||
|
associatePublicIp: true
|
||||||
|
image: kope.io/k8s-1.4-debian-jessie-amd64-hvm-ebs-2016-10-21
|
||||||
|
machineType: m3.medium
|
||||||
|
maxSize: 1
|
||||||
|
minSize: 1
|
||||||
|
role: Master
|
||||||
|
subnets:
|
||||||
|
- us-test-1a
|
|
@ -12,11 +12,11 @@ spec:
|
||||||
etcdClusters:
|
etcdClusters:
|
||||||
- etcdMembers:
|
- etcdMembers:
|
||||||
- instanceGroup: master-us-test-1a
|
- instanceGroup: master-us-test-1a
|
||||||
name: master-us-test-1a
|
name: us-test-1a
|
||||||
name: main
|
name: main
|
||||||
- etcdMembers:
|
- etcdMembers:
|
||||||
- instanceGroup: master-us-test-1a
|
- instanceGroup: master-us-test-1a
|
||||||
name: master-us-test-1a
|
name: us-test-1a
|
||||||
name: events
|
name: events
|
||||||
kubernetesVersion: v1.4.6
|
kubernetesVersion: v1.4.6
|
||||||
masterInternalName: api.internal.minimal.example.com
|
masterInternalName: api.internal.minimal.example.com
|
||||||
|
|
|
@ -12,11 +12,11 @@ spec:
|
||||||
etcdClusters:
|
etcdClusters:
|
||||||
- etcdMembers:
|
- etcdMembers:
|
||||||
- instanceGroup: master-us-test-1a
|
- instanceGroup: master-us-test-1a
|
||||||
name: master-us-test-1a
|
name: us-test-1a
|
||||||
name: main
|
name: main
|
||||||
- etcdMembers:
|
- etcdMembers:
|
||||||
- instanceGroup: master-us-test-1a
|
- instanceGroup: master-us-test-1a
|
||||||
name: master-us-test-1a
|
name: us-test-1a
|
||||||
name: events
|
name: events
|
||||||
kubernetesVersion: v1.4.6
|
kubernetesVersion: v1.4.6
|
||||||
masterInternalName: api.internal.privatecalico.example.com
|
masterInternalName: api.internal.privatecalico.example.com
|
||||||
|
|
|
@ -12,11 +12,11 @@ spec:
|
||||||
etcdClusters:
|
etcdClusters:
|
||||||
- etcdMembers:
|
- etcdMembers:
|
||||||
- instanceGroup: master-us-test-1a
|
- instanceGroup: master-us-test-1a
|
||||||
name: master-us-test-1a
|
name: us-test-1a
|
||||||
name: main
|
name: main
|
||||||
- etcdMembers:
|
- etcdMembers:
|
||||||
- instanceGroup: master-us-test-1a
|
- instanceGroup: master-us-test-1a
|
||||||
name: master-us-test-1a
|
name: us-test-1a
|
||||||
name: events
|
name: events
|
||||||
kubernetesVersion: v1.4.6
|
kubernetesVersion: v1.4.6
|
||||||
masterInternalName: api.internal.privateweave.example.com
|
masterInternalName: api.internal.privateweave.example.com
|
||||||
|
|
Loading…
Reference in New Issue