Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ require (
github.com/imdario/mergo v0.3.6
github.com/json-iterator/go v1.1.5 // indirect
github.com/koki/json v0.0.0-20180412040528-e521cbda08e3
github.com/koki/short v0.4.0
github.com/koki/structurederrors v0.0.0-20180506174113-6b997eb5e2ca
github.com/kr/pretty v0.1.0 // indirect
github.com/kr/pty v1.1.3 // indirect
Expand Down
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,8 @@ github.com/koki/json v0.0.0-20180412040528-e521cbda08e3 h1:9t+domN30eqyAq73D7kBk
github.com/koki/json v0.0.0-20180412040528-e521cbda08e3/go.mod h1:GxoZSBQJ3PAJ3f6MqwA4YHzjqA8AjalvkQEhrBVq094=
github.com/koki/mantle v0.0.0-20181120192352-ca65c4d23a14 h1:rbH1TZeVAUNG+hP6ThJs8dcqZLoZbkHMWBpQMlkGHoE=
github.com/koki/mantle v0.0.0-20190122212551-738f1eadde62 h1:DBwEton1c8BWEmkgv3h+vc7rZx52lEsNtw8BbpJi0ZY=
github.com/koki/short v0.4.0 h1:eSc3KkBjo0oMOFVpwzYYBQtmg99/oXbjjN/nZ8FFc2A=
github.com/koki/short v0.4.0/go.mod h1:+fOE/2zGvDljKx9c0jCYtD2MNKKXq5fA3Qiyj8tVZEs=
github.com/koki/structurederrors v0.0.0-20180506174113-6b997eb5e2ca h1:KmXUVzyPjXzd3kY0feNFsWOGVDYFT4MjjgG8QJx0m6k=
github.com/koki/structurederrors v0.0.0-20180506174113-6b997eb5e2ca/go.mod h1:9ovSGYUTbfN7zFRU4ouJ0kbVhAs/6qO8EQkqRWQkvO8=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
Expand Down
88 changes: 88 additions & 0 deletions pkg/core/namespace/from_kube.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package namespace

import (
"fmt"
"reflect"

serrors "github.com/koki/structurederrors"
"k8s.io/api/core/v1"
)

// NewNamespaceFromKubeNamespace will create a new Namespace object with
// the data from a provided kubernetes namespace object
func NewNamespaceFromKubeNamespace(ns interface{}) (*Namespace, error) {
switch reflect.TypeOf(ns) {
case reflect.TypeOf(v1.Namespace{}):
obj := ns.(v1.Namespace)
if obj.APIVersion != "v1" {
return nil, fmt.Errorf("mis-matched versions. Namespace type: %s, APIVersion: %s", reflect.TypeOf(ns), obj.APIVersion)
}
return fromKubeNamespaceV1(&obj)
case reflect.TypeOf(&v1.Namespace{}):
obj := ns.(*v1.Namespace)
if obj.APIVersion != "v1" {
return nil, fmt.Errorf("mis-matched versions. Namespace type: %s, APIVersion: %s", reflect.TypeOf(ns), obj.APIVersion)
}
return fromKubeNamespaceV1(obj)
default:
return nil, fmt.Errorf("unknown Namespace version: %s", reflect.TypeOf(ns))
}
}

// fromKubeNamespaceV1 converts to koki namespace for V1
func fromKubeNamespaceV1(kubeNamespace *v1.Namespace) (*Namespace, error) {
kokiNamespace := Namespace{}

kokiNamespace.Name = kubeNamespace.Name
kokiNamespace.Namespace = kubeNamespace.Namespace
kokiNamespace.Version = kubeNamespace.APIVersion
kokiNamespace.Cluster = kubeNamespace.ClusterName
kokiNamespace.Labels = kubeNamespace.Labels
kokiNamespace.Annotations = kubeNamespace.Annotations

finalizers, err := fromKubeNamespaceSpecV1(kubeNamespace.Spec)
if err != nil {
return nil, err
}
kokiNamespace.Finalizers = finalizers

phase, err := fromKubeNamespaceStatusV1(kubeNamespace.Status)
if err != nil {
return nil, err
}
kokiNamespace.Phase = phase

return &kokiNamespace, nil
}

// fromKubeNamespaceSpecV1 changes a kubernetes spec to a kubernetes finalizer
func fromKubeNamespaceSpecV1(kubeSpec v1.NamespaceSpec) ([]FinalizerName, error) {
var kokiFinalizers []FinalizerName

for i := range kubeSpec.Finalizers {
kubeFinalizer := kubeSpec.Finalizers[i]

var kokiFinalizer FinalizerName
switch kubeFinalizer {
case v1.FinalizerKubernetes:
kokiFinalizer = FinalizerKubernetes
default:
return nil, serrors.InvalidValueErrorf(kubeFinalizer, "unrecognized finalizer")
}

kokiFinalizers = append(kokiFinalizers, kokiFinalizer)
}

return kokiFinalizers, nil
}

// fromKubeNamespaceStatusV1 changes a kubernetes status to a kubernetes phase
func fromKubeNamespaceStatusV1(kubeStatus v1.NamespaceStatus) (NamespacePhase, error) {
switch kubeStatus.Phase {
case v1.NamespaceActive:
return NamespaceActive, nil
case v1.NamespaceTerminating:
return NamespaceTerminating, nil
}
return NamespaceActive, serrors.InvalidValueErrorf(kubeStatus.Phase, "invalid phase")
}
27 changes: 27 additions & 0 deletions pkg/core/namespace/namespace.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package namespace

type Namespace struct {
Version string `json:"version,omitempty"`
Cluster string `json:"cluster,omitempty"`
Name string `json:"name,omitempty"`
Namespace string `json:"namespace,omitempty"`
Labels map[string]string `json:"labels,omitempty"`
Annotations map[string]string `json:"annotations,omitempty"`

Finalizers []FinalizerName `json:"finalizers,omitempty"`

Phase NamespacePhase `json:"phase,omitempty"`
}

type NamespacePhase int

const (
NamespaceActive NamespacePhase = iota
NamespaceTerminating
)

type FinalizerName int

const (
FinalizerKubernetes FinalizerName = iota
)
Loading