Unverified Commit 5c62dcbb authored by Darren Shepherd's avatar Darren Shepherd Committed by GitHub

Merge pull request #435 from galal-hussein/svclb_upgrade

handle old service lb deployments
parents a46fe4a3 1e33142f
...@@ -42,15 +42,17 @@ func Register(ctx context.Context, kubernetes kubernetes.Interface, enabled, roo ...@@ -42,15 +42,17 @@ func Register(ctx context.Context, kubernetes kubernetes.Interface, enabled, roo
appClients := appclient.ClientsFrom(ctx) appClients := appclient.ClientsFrom(ctx)
h := &handler{ h := &handler{
rootless: rootless, rootless: rootless,
enabled: enabled, enabled: enabled,
nodeCache: clients.Node.Cache(), nodeCache: clients.Node.Cache(),
podCache: clients.Pod.Cache(), podCache: clients.Pod.Cache(),
deploymentCache: appClients.Deployment.Cache(),
processor: objectset.NewProcessor("svccontroller"). processor: objectset.NewProcessor("svccontroller").
Client(appClients.DaemonSet), Client(appClients.DaemonSet),
serviceCache: clients.Service.Cache(), serviceCache: clients.Service.Cache(),
services: kubernetes.CoreV1(), services: kubernetes.CoreV1(),
daemonsets: kubernetes.AppsV1(), daemonsets: kubernetes.AppsV1(),
deployments: kubernetes.AppsV1(),
} }
clients.Service.OnChange(ctx, "svccontroller", h.onChangeService) clients.Service.OnChange(ctx, "svccontroller", h.onChangeService)
...@@ -65,14 +67,16 @@ func Register(ctx context.Context, kubernetes kubernetes.Interface, enabled, roo ...@@ -65,14 +67,16 @@ func Register(ctx context.Context, kubernetes kubernetes.Interface, enabled, roo
} }
type handler struct { type handler struct {
rootless bool rootless bool
enabled bool enabled bool
nodeCache coreclient.NodeClientCache nodeCache coreclient.NodeClientCache
podCache coreclient.PodClientCache podCache coreclient.PodClientCache
processor *objectset.Processor deploymentCache appclient.DeploymentClientCache
serviceCache coreclient.ServiceClientCache processor *objectset.Processor
services coregetter.ServicesGetter serviceCache coreclient.ServiceClientCache
daemonsets v1getter.DaemonSetsGetter services coregetter.ServicesGetter
daemonsets v1getter.DaemonSetsGetter
deployments v1getter.DeploymentsGetter
} }
func (h *handler) onResourceChange(name, namespace string, obj runtime.Object) ([]changeset.Key, error) { func (h *handler) onResourceChange(name, namespace string, obj runtime.Object) ([]changeset.Key, error) {
...@@ -218,7 +222,9 @@ func (h *handler) podIPs(pods []*core.Pod) ([]string, error) { ...@@ -218,7 +222,9 @@ func (h *handler) podIPs(pods []*core.Pod) ([]string, error) {
} }
func (h *handler) deployPod(svc *core.Service) error { func (h *handler) deployPod(svc *core.Service) error {
if err := h.deleteOldDeployments(svc); err != nil {
return err
}
objs := objectset.NewObjectSet() objs := objectset.NewObjectSet()
if !h.enabled { if !h.enabled {
return h.processor.NewDesiredSet(svc, objs).Apply() return h.processor.NewDesiredSet(svc, objs).Apply()
...@@ -363,3 +369,14 @@ func (h *handler) updateDaemonSets() error { ...@@ -363,3 +369,14 @@ func (h *handler) updateDaemonSets() error {
return nil return nil
} }
func (h *handler) deleteOldDeployments(svc *core.Service) error {
name := fmt.Sprintf("svclb-%s", svc.Name)
if _, err := h.deploymentCache.Get(svc.Namespace, name); err != nil {
if errors.IsNotFound(err) {
return nil
}
return err
}
return h.deployments.Deployments(svc.Namespace).Delete(name, &meta.DeleteOptions{})
}
...@@ -37,3 +37,36 @@ func (in *DaemonSetList) DeepCopyObject() runtime.Object { ...@@ -37,3 +37,36 @@ func (in *DaemonSetList) DeepCopyObject() runtime.Object {
} }
return nil return nil
} }
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *DeploymentList) DeepCopyInto(out *DeploymentList) {
*out = *in
out.TypeMeta = in.TypeMeta
out.ListMeta = in.ListMeta
if in.Items != nil {
in, out := &in.Items, &out.Items
*out = make([]appsv1.Deployment, len(*in))
for i := range *in {
(*in)[i].DeepCopyInto(&(*out)[i])
}
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeploymentList.
func (in *DeploymentList) DeepCopy() *DeploymentList {
if in == nil {
return nil
}
out := new(DeploymentList)
in.DeepCopyInto(out)
return out
}
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
func (in *DeploymentList) DeepCopyObject() runtime.Object {
if c := in.DeepCopy(); c != nil {
return c
}
return nil
}
package v1
import (
"github.com/rancher/norman/lifecycle"
v1 "k8s.io/api/apps/v1"
"k8s.io/apimachinery/pkg/runtime"
)
type DeploymentLifecycle interface {
Create(obj *v1.Deployment) (runtime.Object, error)
Remove(obj *v1.Deployment) (runtime.Object, error)
Updated(obj *v1.Deployment) (runtime.Object, error)
}
type deploymentLifecycleAdapter struct {
lifecycle DeploymentLifecycle
}
func (w *deploymentLifecycleAdapter) HasCreate() bool {
o, ok := w.lifecycle.(lifecycle.ObjectLifecycleCondition)
return !ok || o.HasCreate()
}
func (w *deploymentLifecycleAdapter) HasFinalize() bool {
o, ok := w.lifecycle.(lifecycle.ObjectLifecycleCondition)
return !ok || o.HasFinalize()
}
func (w *deploymentLifecycleAdapter) Create(obj runtime.Object) (runtime.Object, error) {
o, err := w.lifecycle.Create(obj.(*v1.Deployment))
if o == nil {
return nil, err
}
return o, err
}
func (w *deploymentLifecycleAdapter) Finalize(obj runtime.Object) (runtime.Object, error) {
o, err := w.lifecycle.Remove(obj.(*v1.Deployment))
if o == nil {
return nil, err
}
return o, err
}
func (w *deploymentLifecycleAdapter) Updated(obj runtime.Object) (runtime.Object, error) {
o, err := w.lifecycle.Updated(obj.(*v1.Deployment))
if o == nil {
return nil, err
}
return o, err
}
func NewDeploymentLifecycleAdapter(name string, clusterScoped bool, client DeploymentInterface, l DeploymentLifecycle) DeploymentHandlerFunc {
adapter := &deploymentLifecycleAdapter{lifecycle: l}
syncFn := lifecycle.NewObjectLifecycleAdapter(name, clusterScoped, adapter, client.ObjectClient())
return func(key string, obj *v1.Deployment) (runtime.Object, error) {
newObj, err := syncFn(key, obj)
if o, ok := newObj.(runtime.Object); ok {
return o, err
}
return nil, err
}
}
...@@ -21,12 +21,14 @@ type Interface interface { ...@@ -21,12 +21,14 @@ type Interface interface {
controller.Starter controller.Starter
DaemonSetsGetter DaemonSetsGetter
DeploymentsGetter
} }
type Clients struct { type Clients struct {
Interface Interface Interface Interface
DaemonSet DaemonSetClient DaemonSet DaemonSetClient
Deployment DeploymentClient
} }
type Client struct { type Client struct {
...@@ -34,7 +36,8 @@ type Client struct { ...@@ -34,7 +36,8 @@ type Client struct {
restClient rest.Interface restClient rest.Interface
starters []controller.Starter starters []controller.Starter
daemonSetControllers map[string]DaemonSetController daemonSetControllers map[string]DaemonSetController
deploymentControllers map[string]DeploymentController
} }
func Factory(ctx context.Context, config rest.Config) (context.Context, controller.Starter, error) { func Factory(ctx context.Context, config rest.Config) (context.Context, controller.Starter, error) {
...@@ -73,6 +76,9 @@ func NewClientsFromInterface(iface Interface) *Clients { ...@@ -73,6 +76,9 @@ func NewClientsFromInterface(iface Interface) *Clients {
DaemonSet: &daemonSetClient2{ DaemonSet: &daemonSetClient2{
iface: iface.DaemonSets(""), iface: iface.DaemonSets(""),
}, },
Deployment: &deploymentClient2{
iface: iface.Deployments(""),
},
} }
} }
...@@ -89,7 +95,8 @@ func NewForConfig(config rest.Config) (Interface, error) { ...@@ -89,7 +95,8 @@ func NewForConfig(config rest.Config) (Interface, error) {
return &Client{ return &Client{
restClient: restClient, restClient: restClient,
daemonSetControllers: map[string]DaemonSetController{}, daemonSetControllers: map[string]DaemonSetController{},
deploymentControllers: map[string]DeploymentController{},
}, nil }, nil
} }
...@@ -117,3 +124,16 @@ func (c *Client) DaemonSets(namespace string) DaemonSetInterface { ...@@ -117,3 +124,16 @@ func (c *Client) DaemonSets(namespace string) DaemonSetInterface {
objectClient: objectClient, objectClient: objectClient,
} }
} }
type DeploymentsGetter interface {
Deployments(namespace string) DeploymentInterface
}
func (c *Client) Deployments(namespace string) DeploymentInterface {
objectClient := objectclient.NewObjectClient(namespace, c.restClient, &DeploymentResource, DeploymentGroupVersionKind, deploymentFactory{})
return &deploymentClient{
ns: namespace,
client: c,
objectClient: objectClient,
}
}
...@@ -34,6 +34,7 @@ func addKnownTypes(scheme *runtime.Scheme) error { ...@@ -34,6 +34,7 @@ func addKnownTypes(scheme *runtime.Scheme) error {
scheme.AddKnownTypes(SchemeGroupVersion, scheme.AddKnownTypes(SchemeGroupVersion,
&DaemonSetList{}, &DaemonSetList{},
&DeploymentList{},
) )
return nil return nil
} }
...@@ -100,6 +100,7 @@ func main() { ...@@ -100,6 +100,7 @@ func main() {
if err := generator.ControllersForForeignTypes(basePackage, appsv1.SchemeGroupVersion, []interface{}{ if err := generator.ControllersForForeignTypes(basePackage, appsv1.SchemeGroupVersion, []interface{}{
appsv1.DaemonSet{}, appsv1.DaemonSet{},
appsv1.Deployment{},
}, nil); err != nil { }, nil); err != nil {
logrus.Fatal(err) logrus.Fatal(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