Unverified Commit 2771ae1b authored by Darren Shepherd's avatar Darren Shepherd Committed by GitHub

Merge pull request #184 from ibuildthecloud/default-ns

Assign default namespace if not set in manifests
parents 937b3796 80d8d312
...@@ -68,6 +68,7 @@ type watcher struct { ...@@ -68,6 +68,7 @@ type watcher struct {
restConfig rest.Config restConfig rest.Config
discovery discovery.DiscoveryInterface discovery discovery.DiscoveryInterface
clients map[schema.GroupVersionKind]*objectclient.ObjectClient clients map[schema.GroupVersionKind]*objectclient.ObjectClient
namespaced map[schema.GroupVersionKind]bool
} }
func (w *watcher) start(ctx context.Context) { func (w *watcher) start(ctx context.Context) {
...@@ -201,15 +202,25 @@ func (w *watcher) apply(addon v1.Addon, set *objectset.ObjectSet) (map[schema.Gr ...@@ -201,15 +202,25 @@ func (w *watcher) apply(addon v1.Addon, set *objectset.ObjectSet) (map[schema.Gr
ds := op.NewDesiredSet(nil, set) ds := op.NewDesiredSet(nil, set)
for _, gvk := range addon.Status.GVKs { for _, gvk := range addon.Status.GVKs {
var (
namespaced bool
)
client, ok := w.clients[gvk] client, ok := w.clients[gvk]
if !ok { if ok {
client, err = objectset.NewDiscoveredClient(gvk, w.restConfig, w.discovery) namespaced = w.namespaced[gvk]
} else {
client, namespaced, err = objectset.NewDiscoveredClient(gvk, w.restConfig, w.discovery)
if err != nil { if err != nil {
return nil, err return nil, err
} }
if w.namespaced == nil {
w.namespaced = map[schema.GroupVersionKind]bool{}
}
w.namespaced[gvk] = namespaced
} }
ds.AddDiscoveredClient(gvk, client) ds.AddDiscoveredClient(gvk, client, namespaced)
} }
if err := ds.Apply(); err != nil { if err := ds.Apply(); err != nil {
......
...@@ -11,7 +11,7 @@ package=github.com/opencontainers/runc/contrib/cmd/recvtty ...@@ -11,7 +11,7 @@ package=github.com/opencontainers/runc/contrib/cmd/recvtty
k8s.io/kubernetes v1.13.4-k3s.1 https://github.com/rancher/k3s.git transitive=true,staging=true k8s.io/kubernetes v1.13.4-k3s.1 https://github.com/rancher/k3s.git transitive=true,staging=true
github.com/rancher/norman 816007443daf04e96c7806c2a637dfab8ede9429 https://github.com/ibuildthecloud/norman.git github.com/rancher/norman f75e3607e96e1a5d3cbaf4ee7cea1459cc727f61 https://github.com/ibuildthecloud/norman.git
github.com/coreos/flannel 823afe66b2266bf71f5bec24e6e28b26d70cfc7c https://github.com/ibuildthecloud/flannel.git github.com/coreos/flannel 823afe66b2266bf71f5bec24e6e28b26d70cfc7c https://github.com/ibuildthecloud/flannel.git
github.com/natefinch/lumberjack aee4629129445bbdfb69aa565537dcfa16544311 github.com/natefinch/lumberjack aee4629129445bbdfb69aa565537dcfa16544311
github.com/gorilla/mux v1.6.2 github.com/gorilla/mux v1.6.2
......
...@@ -82,10 +82,6 @@ func (c *Config) Build(ctx context.Context, opts *Options) (context.Context, *Se ...@@ -82,10 +82,6 @@ func (c *Config) Build(ctx context.Context, opts *Options) (context.Context, *Se
return ctx, nil, err return ctx, nil, err
} }
if !opts.DisableControllers {
go c.masterControllers(ctx, starters, r)
}
if c.EnableAPI { if c.EnableAPI {
if err := c.apiServer(ctx, r); err != nil { if err := c.apiServer(ctx, r); err != nil {
return ctx, nil, err return ctx, nil, err
...@@ -100,6 +96,7 @@ func (c *Config) Build(ctx context.Context, opts *Options) (context.Context, *Se ...@@ -100,6 +96,7 @@ func (c *Config) Build(ctx context.Context, opts *Options) (context.Context, *Se
if !opts.DisableControllers { if !opts.DisableControllers {
err = controller.SyncThenStart(ctx, c.Threadiness, starters...) err = controller.SyncThenStart(ctx, c.Threadiness, starters...)
go c.masterControllers(ctx, starters, r)
} }
return ctx, server, err return ctx, server, err
......
...@@ -293,6 +293,7 @@ func (p *ObjectClient) Patch(name string, o runtime.Object, patchType types.Patc ...@@ -293,6 +293,7 @@ func (p *ObjectClient) Patch(name string, o runtime.Object, patchType types.Patc
if len(name) == 0 { if len(name) == 0 {
return result, errors.New("object missing name") return result, errors.New("object missing name")
} }
logrus.Debugf("REST PATCH %s/%s/%s/%s/%s", p.getAPIPrefix(), p.gvk.Group, p.gvk.Version, p.ns, name)
err := p.restClient.Patch(patchType). err := p.restClient.Patch(patchType).
Prefix(p.getAPIPrefix(), p.gvk.Group, p.gvk.Version). Prefix(p.getAPIPrefix(), p.gvk.Group, p.gvk.Version).
NamespaceIfScoped(ns, p.resource.Namespaced). NamespaceIfScoped(ns, p.resource.Namespaced).
......
...@@ -12,6 +12,7 @@ import ( ...@@ -12,6 +12,7 @@ import (
type DesiredSet struct { type DesiredSet struct {
discoveredClients map[schema.GroupVersionKind]*objectclient.ObjectClient discoveredClients map[schema.GroupVersionKind]*objectclient.ObjectClient
namespaced map[schema.GroupVersionKind]bool
discovery discovery.DiscoveryInterface discovery discovery.DiscoveryInterface
restConfig rest.Config restConfig rest.Config
remove bool remove bool
...@@ -25,11 +26,15 @@ type DesiredSet struct { ...@@ -25,11 +26,15 @@ type DesiredSet struct {
errs []error errs []error
} }
func (o *DesiredSet) AddDiscoveredClient(gvk schema.GroupVersionKind, client *objectclient.ObjectClient) { func (o *DesiredSet) AddDiscoveredClient(gvk schema.GroupVersionKind, client *objectclient.ObjectClient, namespaced bool) {
if o.discoveredClients == nil { if o.discoveredClients == nil {
o.discoveredClients = map[schema.GroupVersionKind]*objectclient.ObjectClient{} o.discoveredClients = map[schema.GroupVersionKind]*objectclient.ObjectClient{}
} }
o.discoveredClients[gvk] = client o.discoveredClients[gvk] = client
if o.namespaced == nil {
o.namespaced = map[schema.GroupVersionKind]bool{}
}
o.namespaced[gvk] = namespaced
} }
func (o *DesiredSet) DiscoveredClients() map[schema.GroupVersionKind]*objectclient.ObjectClient { func (o *DesiredSet) DiscoveredClients() map[schema.GroupVersionKind]*objectclient.ObjectClient {
......
...@@ -25,6 +25,7 @@ import ( ...@@ -25,6 +25,7 @@ import (
) )
var ( var (
defaultNamespace = "default"
deletePolicy = v1.DeletePropagationBackground deletePolicy = v1.DeletePropagationBackground
ErrReplace = errors.New("replace object with changes") ErrReplace = errors.New("replace object with changes")
ReplaceOnChange = func(name string, o runtime.Object, patchType types2.PatchType, data []byte, subresources ...string) (runtime.Object, error) { ReplaceOnChange = func(name string, o runtime.Object, patchType types2.PatchType, data []byte, subresources ...string) (runtime.Object, error) {
...@@ -32,10 +33,10 @@ var ( ...@@ -32,10 +33,10 @@ var (
} }
) )
func NewDiscoveredClient(gvk schema.GroupVersionKind, restConfig rest.Config, discovery discovery.DiscoveryInterface) (*objectclient.ObjectClient, error) { func NewDiscoveredClient(gvk schema.GroupVersionKind, restConfig rest.Config, discovery discovery.DiscoveryInterface) (*objectclient.ObjectClient, bool, error) {
resources, err := discovery.ServerResourcesForGroupVersion(gvk.GroupVersion().String()) resources, err := discovery.ServerResourcesForGroupVersion(gvk.GroupVersion().String())
if err != nil { if err != nil {
return nil, err return nil, false, err
} }
for _, resource := range resources.APIResources { for _, resource := range resources.APIResources {
...@@ -49,14 +50,14 @@ func NewDiscoveredClient(gvk schema.GroupVersionKind, restConfig rest.Config, di ...@@ -49,14 +50,14 @@ func NewDiscoveredClient(gvk schema.GroupVersionKind, restConfig rest.Config, di
restClient, err := restwatch.UnversionedRESTClientFor(&restConfig) restClient, err := restwatch.UnversionedRESTClientFor(&restConfig)
if err != nil { if err != nil {
return nil, err return nil, false, err
} }
objectClient := objectclient.NewObjectClient("", restClient, &resource, gvk, &objectclient.UnstructuredObjectFactory{}) objectClient := objectclient.NewObjectClient("", restClient, &resource, gvk, &objectclient.UnstructuredObjectFactory{})
return objectClient, nil return objectClient, resource.Namespaced, nil
} }
return nil, fmt.Errorf("failed to discover client for %s", gvk) return nil, false, fmt.Errorf("failed to discover client for %s", gvk)
} }
func (o *DesiredSet) getControllerAndObjectClient(debugID string, gvk schema.GroupVersionKind) (controller.GenericController, *objectclient.ObjectClient, error) { func (o *DesiredSet) getControllerAndObjectClient(debugID string, gvk schema.GroupVersionKind) (controller.GenericController, *objectclient.ObjectClient, error) {
...@@ -74,15 +75,42 @@ func (o *DesiredSet) getControllerAndObjectClient(debugID string, gvk schema.Gro ...@@ -74,15 +75,42 @@ func (o *DesiredSet) getControllerAndObjectClient(debugID string, gvk schema.Gro
return nil, objectClient, nil return nil, objectClient, nil
} }
objectClient, err := NewDiscoveredClient(gvk, o.restConfig, o.discovery) objectClient, namespaced, err := NewDiscoveredClient(gvk, o.restConfig, o.discovery)
if err != nil { if err != nil {
return nil, nil, errors.Wrapf(err, "failed to find client for %s for %s", gvk, debugID) return nil, nil, errors.Wrapf(err, "failed to find client for %s for %s", gvk, debugID)
} }
o.AddDiscoveredClient(gvk, objectClient) o.AddDiscoveredClient(gvk, objectClient, namespaced)
return nil, objectClient, nil return nil, objectClient, nil
} }
func (o *DesiredSet) adjustNamespace(gvk schema.GroupVersionKind, objs map[objectKey]runtime.Object) error {
namespaced, ok := o.namespaced[gvk]
if !ok || !namespaced {
return nil
}
for k, v := range objs {
if k.namespace != "" {
continue
}
v = v.DeepCopyObject()
meta, err := meta.Accessor(v)
if err != nil {
return err
}
meta.SetNamespace(defaultNamespace)
delete(objs, k)
k.namespace = defaultNamespace
objs[k] = v
}
return nil
}
func (o *DesiredSet) process(inputID, debugID string, set labels.Selector, gvk schema.GroupVersionKind, objs map[objectKey]runtime.Object) { func (o *DesiredSet) process(inputID, debugID string, set labels.Selector, gvk schema.GroupVersionKind, objs map[objectKey]runtime.Object) {
controller, objectClient, err := o.getControllerAndObjectClient(debugID, gvk) controller, objectClient, err := o.getControllerAndObjectClient(debugID, gvk)
if err != nil { if err != nil {
...@@ -90,6 +118,11 @@ func (o *DesiredSet) process(inputID, debugID string, set labels.Selector, gvk s ...@@ -90,6 +118,11 @@ func (o *DesiredSet) process(inputID, debugID string, set labels.Selector, gvk s
return return
} }
if err := o.adjustNamespace(gvk, objs); err != nil {
o.err(err)
return
}
patcher, ok := o.patchers[gvk] patcher, ok := o.patchers[gvk]
if !ok { if !ok {
patcher = objectClient.Patch patcher = objectClient.Patch
...@@ -224,7 +257,8 @@ func list(controller controller.GenericController, objectClient *objectclient.Ob ...@@ -224,7 +257,8 @@ func list(controller controller.GenericController, objectClient *objectclient.Ob
} }
for _, obj := range list.Items { for _, obj := range list.Items {
if err := addObjectToMap(objs, &obj); err != nil { copy := obj
if err := addObjectToMap(objs, &copy); err != nil {
errs = append(errs, err) errs = append(errs, err)
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment