Skip to content

Commit

Permalink
Bugfix/fix etcd cluster exists check (#319)
Browse files Browse the repository at this point in the history
* Fix etcd-cluster exists check & remove deprecated parameter from NamespaceName

* Increase step timeout to 20 minutes

* Increase step timeout to 20 minutes

* Remove command timeout

* set no-response-timeout on root level

* Increase deadline to 1200s
  • Loading branch information
mrIncompetent committed Apr 12, 2017
1 parent a1050a4 commit 502cd54
Show file tree
Hide file tree
Showing 8 changed files with 44 additions and 60 deletions.
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ gometalinter:
--vendor \
--cyclo-over=13 \
--tests \
--deadline=600s \
--deadline=1200s \
--dupl-threshold=53 \
--concurrency=2 \
--disable=gotype --disable=aligncheck --disable=unconvert --disable=structcheck --disable=interfacer --disable=deadcode --disable=gocyclo --disable=dupl --disable=gosimple --disable=gas --disable=vet --disable=vetshadow\
Expand Down
4 changes: 2 additions & 2 deletions controller/cluster/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -451,7 +451,7 @@ func (cc *clusterController) recordClusterPhaseChange(ns *v1.Namespace, newPhase
}

func (cc *clusterController) recordClusterEvent(c *api.Cluster, reason, msg string, args ...interface{}) {
nsName := kprovider.NamespaceName(c.Metadata.User, c.Metadata.Name)
nsName := kprovider.NamespaceName(c.Metadata.Name)
ref := &v1.ObjectReference{
Kind: "Namespace",
Name: nsName,
Expand All @@ -463,7 +463,7 @@ func (cc *clusterController) recordClusterEvent(c *api.Cluster, reason, msg stri
}

func (cc *clusterController) updateCluster(oldC, newC *api.Cluster) error {
ns := kprovider.NamespaceName(newC.Metadata.User, newC.Metadata.Name)
ns := kprovider.NamespaceName(newC.Metadata.Name)
for i := 0; i < maxUpdateRetries; i++ {
// try to get current namespace
oldNS, err := cc.client.CoreV1().Namespaces().Get(ns, metav1.GetOptions{})
Expand Down
2 changes: 1 addition & 1 deletion controller/cluster/launching.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import (
)

func (cc *clusterController) clusterHealth(c *api.Cluster) (bool, *api.ClusterHealth, error) {
ns := kubernetes.NamespaceName(c.Metadata.User, c.Metadata.Name)
ns := kubernetes.NamespaceName(c.Metadata.Name)
deps, err := cc.depStore.ByIndex("namespace", ns)
if err != nil {
return false, nil, err
Expand Down
63 changes: 23 additions & 40 deletions controller/cluster/pending.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import (
"github.com/kubermatic/api/controller/resources"
"github.com/kubermatic/api/controller/template"
"github.com/kubermatic/api/extensions"
etcdcluster "github.com/kubermatic/api/extensions/etcd"
"github.com/kubermatic/api/provider/kubernetes"
"k8s.io/client-go/pkg/api/v1"
extensionsv1beta1 "k8s.io/client-go/pkg/apis/extensions/v1beta1"
Expand Down Expand Up @@ -121,7 +120,7 @@ func (cc *clusterController) pendingCheckSecrets(c *api.Cluster) (*api.Cluster,
recreateSecrets["apiserver-ssh"] = struct{}{}
}

ns := kubernetes.NamespaceName(c.Metadata.User, c.Metadata.Name)
ns := kubernetes.NamespaceName(c.Metadata.Name)
for s, gen := range secrets {
key := fmt.Sprintf("%s/%s", ns, s)
_, exists, err := cc.secretStore.GetByKey(key)
Expand Down Expand Up @@ -166,7 +165,7 @@ func (cc *clusterController) pendingCheckSecrets(c *api.Cluster) (*api.Cluster,
}

func (cc *clusterController) launchingCheckTokenUsers(c *api.Cluster) (*api.Cluster, error) {
ns := kubernetes.NamespaceName(c.Metadata.User, c.Metadata.Name)
ns := kubernetes.NamespaceName(c.Metadata.Name)

key := fmt.Sprintf("%s/token-users", ns)
_, exists, err := cc.secretStore.GetByKey(key)
Expand Down Expand Up @@ -195,7 +194,7 @@ func (cc *clusterController) launchingCheckServices(c *api.Cluster) (*api.Cluste
"apiserver": resources.LoadServiceFile,
}

ns := kubernetes.NamespaceName(c.Metadata.User, c.Metadata.Name)
ns := kubernetes.NamespaceName(c.Metadata.Name)
for s, gen := range services {
key := fmt.Sprintf("%s/%s", ns, s)
_, exists, err := cc.serviceStore.GetByKey(key)
Expand Down Expand Up @@ -235,7 +234,7 @@ func (cc *clusterController) launchingCheckIngress(c *api.Cluster) error {
"k8sniff": resources.LoadIngressFile,
}

ns := kubernetes.NamespaceName(c.Metadata.User, c.Metadata.Name)
ns := kubernetes.NamespaceName(c.Metadata.Name)
for app, gen := range ingress {
key := fmt.Sprintf("%s/%s", ns, app)
_, exists, err := cc.ingressStore.GetByKey(key)
Expand All @@ -262,7 +261,7 @@ func (cc *clusterController) launchingCheckIngress(c *api.Cluster) error {
}

func (cc *clusterController) launchingCheckDeployments(c *api.Cluster) (*api.Cluster, error) {
ns := kubernetes.NamespaceName(c.Metadata.User, c.Metadata.Name)
ns := kubernetes.NamespaceName(c.Metadata.Name)

if c.Spec.MasterVersion == "" {
c.Spec.MasterVersion = cc.defaultMasterVersion.ID
Expand Down Expand Up @@ -319,7 +318,7 @@ func (cc *clusterController) launchingCheckDeployments(c *api.Cluster) (*api.Clu
}

func (cc *clusterController) launchingCheckConfigMaps(c *api.Cluster) error {
ns := kubernetes.NamespaceName(c.Metadata.User, c.Metadata.Name)
ns := kubernetes.NamespaceName(c.Metadata.Name)

cms := map[string]func(c *api.Cluster) (*v1.ConfigMap, error){}
if c.Spec.Cloud != nil && c.Spec.Cloud.AWS != nil {
Expand Down Expand Up @@ -355,7 +354,7 @@ func (cc *clusterController) launchingCheckConfigMaps(c *api.Cluster) error {
}

func (cc *clusterController) launchingCheckPvcs(c *api.Cluster) error {
ns := kubernetes.NamespaceName(c.Metadata.User, c.Metadata.Name)
ns := kubernetes.NamespaceName(c.Metadata.Name)

pvcs := map[string]func(c *api.Cluster, app, masterResourcesPath string) (*v1.PersistentVolumeClaim, error){
// Currently not required pvc for etcd is done by etcd-operator
Expand Down Expand Up @@ -392,7 +391,7 @@ func (cc *clusterController) launchingCheckPvcs(c *api.Cluster) error {
}

func (cc *clusterController) launchingCheckDefaultPlugins(c *api.Cluster) error {
ns := kubernetes.NamespaceName(c.Metadata.User, c.Metadata.Name)
ns := kubernetes.NamespaceName(c.Metadata.Name)
defaultPlugins := map[string]string{
"flannelcni": "flannel-cni",
"heapster": "heapster",
Expand Down Expand Up @@ -431,8 +430,7 @@ func (cc *clusterController) launchingCheckDefaultPlugins(c *api.Cluster) error
}

func (cc *clusterController) launchingCheckEtcdCluster(c *api.Cluster) (*api.Cluster, error) {
ns := kubernetes.NamespaceName(c.Metadata.User, c.Metadata.Name)

ns := kubernetes.NamespaceName(c.Metadata.Name)
if c.Spec.MasterVersion == "" {
c.Spec.MasterVersion = cc.defaultMasterVersion.ID
}
Expand All @@ -445,43 +443,28 @@ func (cc *clusterController) launchingCheckEtcdCluster(c *api.Cluster) (*api.Clu
return c, fmt.Errorf("unknown new cluster %q master version %q", c.Metadata.Name, c.Spec.MasterVersion)
}

etcds := map[string]string{
"etcd": masterVersion.EtcdClusterYaml,
etcd, err := resources.LoadEtcdClustertFile(c, masterVersion, cc.masterResourcesPath, cc.dc, masterVersion.EtcdClusterYaml)
if err != nil {
return nil, fmt.Errorf("failed to load etcd-cluster: %v", err)
}

existingEtcds, err := cc.etcdClusterStore.ByIndex("namespace", ns)
key := fmt.Sprintf("%s/%s", ns, etcd.Metadata.Name)
_, exists, err := cc.etcdClusterStore.GetByKey(key)
if err != nil {
return nil, err
}

for s, yamlFile := range etcds {
exists := false
var etcd *etcdcluster.Cluster
for _, obj := range existingEtcds {
etcd := obj.(*etcdcluster.Cluster)

if etcd.Metadata.Name == s {
exists = true
break
}
}
if exists {
glog.V(7).Infof("Skipping already existing etcd-cluster %q for cluster %q", s, c.Metadata.Name)
continue
}

etcd, err := resources.LoadEtcdClustertFile(c, masterVersion, cc.masterResourcesPath, cc.dc, yamlFile)
if err != nil {
return nil, fmt.Errorf("failed to generate deployment %s: %v", s, err)
}

_, err = cc.etcdClusterClient.Cluster(fmt.Sprintf("cluster-%s", c.Metadata.Name)).Create(etcd)
if err != nil {
return nil, fmt.Errorf("failed to create ecd %s: %v", s, err)
}
if exists {
glog.V(7).Infof("Skipping already existing etcd-cluster for cluster %q", c.Metadata.Name)
return c, nil
}

cc.recordClusterEvent(c, "launching", "Created etcd %q", s)
_, err = cc.etcdClusterClient.Cluster(ns).Create(etcd)
if err != nil {
return nil, fmt.Errorf("failed to create ecd-cluster definition (tpr): %v", err)
}

cc.recordClusterEvent(c, "launching", "Created etcd-cluster", etcd.Metadata.Name)

return nil, nil
}
6 changes: 3 additions & 3 deletions controller/update/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ func (u *Controller) updateDeployment(c *api.Cluster, yamlFiles []string, master
return nil, err
}

ns := kubernetes.NamespaceName(c.Metadata.User, c.Metadata.Name)
ns := kubernetes.NamespaceName(c.Metadata.Name)
_, err = u.Client.ExtensionsV1beta1().Deployments(ns).Update(dep)
if errors.IsNotFound(err) {
glog.Errorf("expected an %s deployment, but didn't find any for cluster %v. Creating a new one.", dep.Name, c.Metadata.Name)
Expand Down Expand Up @@ -126,7 +126,7 @@ func (u *Controller) updateEtcdCluster(c *api.Cluster, yamlFiles []string, maste
}

func (u *Controller) waitForEtcdCluster(c *api.Cluster, names []string, fallbackPhase api.MasterUpdatePhase) (*api.Cluster, bool, error) {
ns := kubernetes.NamespaceName(c.Metadata.User, c.Metadata.Name)
ns := kubernetes.NamespaceName(c.Metadata.Name)

for _, name := range names {
obj, exists, err := u.EtcdClusterStore.GetByKey(fmt.Sprintf("%s/%s", ns, name))
Expand All @@ -148,7 +148,7 @@ func (u *Controller) waitForEtcdCluster(c *api.Cluster, names []string, fallback
}

func (u *Controller) waitForDeployments(c *api.Cluster, names []string, fallbackPhase api.MasterUpdatePhase) (*api.Cluster, bool, error) {
ns := kubernetes.NamespaceName(c.Metadata.User, c.Metadata.Name)
ns := kubernetes.NamespaceName(c.Metadata.Name)

for _, name := range names {
dep, exists, err := u.DepStore.GetByKey(fmt.Sprintf("%s/%s", ns, name))
Expand Down
16 changes: 8 additions & 8 deletions provider/kubernetes/kubernetes.go
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ func (p *kubernetesProvider) NewClusterWithCloud(user provider.User, spec *api.C

ns := &v1.Namespace{
ObjectMeta: v1.ObjectMeta{
Name: NamespaceName(user.Name, clusterName),
Name: NamespaceName(clusterName),
Annotations: map[string]string{},
Labels: map[string]string{},
},
Expand Down Expand Up @@ -175,7 +175,7 @@ func (p *kubernetesProvider) NewClusterWithCloud(user provider.User, spec *api.C
defer func(ns *v1.Namespace, prov provider.CloudProvider, c *api.Cluster, err error) {
if err != nil {
_ = prov.CleanUp(c)
_ = p.client.Namespaces().Delete(NamespaceName(user.Name, c.Metadata.Name), &v1.DeleteOptions{})
_ = p.client.Namespaces().Delete(NamespaceName(c.Metadata.Name), &v1.DeleteOptions{})
}
}(ns, prov, c, err)

Expand Down Expand Up @@ -217,7 +217,7 @@ func (p *kubernetesProvider) NewCluster(user provider.User, spec *api.ClusterSpe

ns := &v1.Namespace{
ObjectMeta: v1.ObjectMeta{
Name: NamespaceName(user.Name, clusterName),
Name: NamespaceName(clusterName),
Annotations: map[string]string{},
Labels: map[string]string{},
},
Expand Down Expand Up @@ -258,7 +258,7 @@ func (p *kubernetesProvider) NewCluster(user provider.User, spec *api.ClusterSpe
c, err = UnmarshalCluster(p.cps, ns)

if err != nil {
_ = p.client.Namespaces().Delete(NamespaceName(user.Name, clusterName), &v1.DeleteOptions{})
_ = p.client.Namespaces().Delete(NamespaceName(clusterName), &v1.DeleteOptions{})
return nil, err
}

Expand All @@ -269,7 +269,7 @@ func (p *kubernetesProvider) clusterAndNS(user provider.User, cluster string) (*
p.mu.Lock()
defer p.mu.Unlock()

ns, err := p.client.Namespaces().Get(NamespaceName(user.Name, cluster), metav1.GetOptions{})
ns, err := p.client.Namespaces().Get(NamespaceName(cluster), metav1.GetOptions{})
if err != nil {
if kerrors.IsNotFound(err) {
return nil, nil, kerrors.NewNotFound(rbac.Resource("cluster"), cluster)
Expand Down Expand Up @@ -418,18 +418,18 @@ func (p *kubernetesProvider) DeleteCluster(user provider.User, cluster string) e
return err
}

list, err := p.tprClient.ClusterAddons(NamespaceName(user.Name, cluster)).List(v1.ListOptions{LabelSelector: labels.Everything().String()})
list, err := p.tprClient.ClusterAddons(NamespaceName(cluster)).List(v1.ListOptions{LabelSelector: labels.Everything().String()})
if err != nil {
return err
}
for _, item := range list.Items {
err = p.tprClient.ClusterAddons(NamespaceName(user.Name, cluster)).Delete(item.Metadata.Name, nil)
err = p.tprClient.ClusterAddons(NamespaceName(cluster)).Delete(item.Metadata.Name, nil)
if err != nil {
return err
}
}

return p.client.Namespaces().Delete(NamespaceName(user.Name, cluster), &v1.DeleteOptions{})
return p.client.Namespaces().Delete(NamespaceName(cluster), &v1.DeleteOptions{})
}

func (p *kubernetesProvider) CreateAddon(user provider.User, cluster string, addonName string) (*extensions.ClusterAddon, error) {
Expand Down
6 changes: 3 additions & 3 deletions provider/kubernetes/marshal.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,8 @@ const (
flannelCIDRADefault = "172.25.0.0/16"
)

// NamespaceName create a namespace name for a given user and cluster.
func NamespaceName(user, cluster string) string {
// NamespaceName create a namespace name for a given cluster.
func NamespaceName(cluster string) string {
return fmt.Sprintf("%s-%s", namePrefix, cluster)
}

Expand Down Expand Up @@ -188,7 +188,7 @@ func MarshalCluster(cps map[string]provider.CloudProvider, c *api.Cluster, ns *v
ns.Annotations = as

// check name
if ns.Name != "" && ns.Name != NamespaceName(c.Metadata.User, c.Metadata.Name) {
if ns.Name != "" && ns.Name != NamespaceName(c.Metadata.Name) {
return nil, fmt.Errorf("cannot rename cluster %s", ns.Name)
}

Expand Down
5 changes: 3 additions & 2 deletions wercker.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
no-response-timeout: 20
dev:
box: golang:1.7
box: golang:1.8
steps:
- setup-go-workspace:
package-dir: github.com/kubermatic/api
Expand All @@ -11,7 +12,7 @@ dev:
reload: true

build:
box: golang:1.7
box: golang:1.8
steps:
- setup-go-workspace:
package-dir: github.com/kubermatic/api
Expand Down

0 comments on commit 502cd54

Please sign in to comment.