Skip to content

Commit

Permalink
Inject errors in topology
Browse files Browse the repository at this point in the history
  • Loading branch information
lbenguigui committed May 4, 2020
1 parent 8284a71 commit 00b3cd6
Show file tree
Hide file tree
Showing 8 changed files with 266 additions and 148 deletions.
32 changes: 16 additions & 16 deletions pkg/controller/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,12 @@ import (
"github.com/containous/maesh/pkg/topology"
"github.com/containous/traefik/v2/pkg/config/dynamic"
"github.com/containous/traefik/v2/pkg/safe"
accessInformer "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/access/informers/externalversions"
accessLister "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/access/listers/access/v1alpha1"
specsInformer "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/specs/informers/externalversions"
specsLister "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/specs/listers/specs/v1alpha1"
splitInformer "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/split/informers/externalversions"
splitLister "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/split/listers/split/v1alpha2"
accessinformer "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/access/informers/externalversions"
accesslister "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/access/listers/access/v1alpha1"
specsinformer "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/specs/informers/externalversions"
specslister "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/specs/listers/specs/v1alpha1"
splitinformer "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/split/informers/externalversions"
splitlister "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/split/listers/split/v1alpha2"
"github.com/sirupsen/logrus"
"golang.org/x/sync/errgroup"
corev1 "k8s.io/api/core/v1"
Expand Down Expand Up @@ -88,16 +88,16 @@ type Controller struct {

clients k8s.Client
kubernetesFactory informers.SharedInformerFactory
accessFactory accessInformer.SharedInformerFactory
specsFactory specsInformer.SharedInformerFactory
splitFactory splitInformer.SharedInformerFactory
accessFactory accessinformer.SharedInformerFactory
specsFactory specsinformer.SharedInformerFactory
splitFactory splitinformer.SharedInformerFactory
PodLister listers.PodLister
ServiceLister listers.ServiceLister
EndpointsLister listers.EndpointsLister
TrafficTargetLister accessLister.TrafficTargetLister
HTTPRouteGroupLister specsLister.HTTPRouteGroupLister
TCPRouteLister specsLister.TCPRouteLister
TrafficSplitLister splitLister.TrafficSplitLister
TrafficTargetLister accesslister.TrafficTargetLister
HTTPRouteGroupLister specslister.HTTPRouteGroupLister
TCPRouteLister specslister.TCPRouteLister
TrafficSplitLister splitlister.TrafficSplitLister
}

// NewMeshController is used to build the informers and other required components of the mesh controller,
Expand Down Expand Up @@ -140,7 +140,7 @@ func NewMeshController(clients k8s.Client, cfg Config, logger logrus.FieldLogger
func (c *Controller) init() {
// Create SharedInformers for non-ACL related resources.
c.kubernetesFactory = informers.NewSharedInformerFactoryWithOptions(c.clients.GetKubernetesClient(), k8s.ResyncPeriod)
c.splitFactory = splitInformer.NewSharedInformerFactoryWithOptions(c.clients.GetSplitClient(), k8s.ResyncPeriod)
c.splitFactory = splitinformer.NewSharedInformerFactoryWithOptions(c.clients.GetSplitClient(), k8s.ResyncPeriod)

c.ServiceLister = c.kubernetesFactory.Core().V1().Services().Lister()
c.serviceManager = NewShadowServiceManager(c.logger, c.ServiceLister, c.cfg.Namespace, c.tcpStateTable, c.udpStateTable, c.cfg.DefaultMode, c.cfg.MinHTTPPort, c.cfg.MaxHTTPPort, c.clients.GetKubernetesClient())
Expand All @@ -161,8 +161,8 @@ func (c *Controller) init() {

// Create SharedInformers, listers and register the event handler for ACL related resources.
if c.cfg.ACLEnabled {
c.accessFactory = accessInformer.NewSharedInformerFactoryWithOptions(c.clients.GetAccessClient(), k8s.ResyncPeriod)
c.specsFactory = specsInformer.NewSharedInformerFactoryWithOptions(c.clients.GetSpecsClient(), k8s.ResyncPeriod)
c.accessFactory = accessinformer.NewSharedInformerFactoryWithOptions(c.clients.GetAccessClient(), k8s.ResyncPeriod)
c.specsFactory = specsinformer.NewSharedInformerFactoryWithOptions(c.clients.GetSpecsClient(), k8s.ResyncPeriod)

c.TrafficTargetLister = c.accessFactory.Access().V1alpha1().TrafficTargets().Lister()
c.HTTPRouteGroupLister = c.specsFactory.Specs().V1alpha1().HTTPRouteGroups().Lister()
Expand Down
48 changes: 24 additions & 24 deletions pkg/k8s/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,32 +3,32 @@ package k8s
import (
"fmt"

accessClient "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/access/clientset/versioned"
specsClient "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/specs/clientset/versioned"
splitClient "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/split/clientset/versioned"
accessclient "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/access/clientset/versioned"
specsclient "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/specs/clientset/versioned"
splitclient "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/split/clientset/versioned"
"github.com/sirupsen/logrus"
kubeClient "k8s.io/client-go/kubernetes"
kubeclient "k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
)

// Client is an interface for the various resource controllers.
type Client interface {
GetKubernetesClient() kubeClient.Interface
GetAccessClient() accessClient.Interface
GetSpecsClient() specsClient.Interface
GetSplitClient() splitClient.Interface
GetKubernetesClient() kubeclient.Interface
GetAccessClient() accessclient.Interface
GetSpecsClient() specsclient.Interface
GetSplitClient() splitclient.Interface
}

// Ensure the client wrapper fits the Client interface
var _ Client = (*ClientWrapper)(nil)

// ClientWrapper holds the clients for the various resource controllers.
type ClientWrapper struct {
kubeClient *kubeClient.Clientset
accessClient *accessClient.Clientset
specsClient *specsClient.Clientset
splitClient *splitClient.Clientset
kubeClient *kubeclient.Clientset
accessClient *accessclient.Clientset
specsClient *specsclient.Clientset
splitClient *splitclient.Clientset
}

// NewClient creates and returns a ClientWrapper that satisfies the Client interface.
Expand Down Expand Up @@ -67,30 +67,30 @@ func NewClient(log logrus.FieldLogger, url string, kubeConfig string) (Client, e
}

// GetKubernetesClient is used to get the kubernetes clientset.
func (w *ClientWrapper) GetKubernetesClient() kubeClient.Interface {
func (w *ClientWrapper) GetKubernetesClient() kubeclient.Interface {
return w.kubeClient
}

// GetAccessClient is used to get the SMI Access clientset.
func (w *ClientWrapper) GetAccessClient() accessClient.Interface {
func (w *ClientWrapper) GetAccessClient() accessclient.Interface {
return w.accessClient
}

// GetSpecsClient is used to get the SMI Specs clientset.
func (w *ClientWrapper) GetSpecsClient() specsClient.Interface {
func (w *ClientWrapper) GetSpecsClient() specsclient.Interface {
return w.specsClient
}

// GetSplitClient is used to get the SMI Split clientset.
func (w *ClientWrapper) GetSplitClient() splitClient.Interface {
func (w *ClientWrapper) GetSplitClient() splitclient.Interface {
return w.splitClient
}

// buildClient returns a useable kubernetes client.
func buildKubernetesClient(log logrus.FieldLogger, config *rest.Config) (*kubeClient.Clientset, error) {
func buildKubernetesClient(log logrus.FieldLogger, config *rest.Config) (*kubeclient.Clientset, error) {
log.Debugln("Building Kubernetes Client...")

client, err := kubeClient.NewForConfig(config)
client, err := kubeclient.NewForConfig(config)
if err != nil {
return nil, fmt.Errorf("unable to create kubernetes client: %v", err)
}
Expand All @@ -99,10 +99,10 @@ func buildKubernetesClient(log logrus.FieldLogger, config *rest.Config) (*kubeCl
}

// buildSmiAccessClient returns a client to manage SMI Access objects.
func buildSmiAccessClient(log logrus.FieldLogger, config *rest.Config) (*accessClient.Clientset, error) {
func buildSmiAccessClient(log logrus.FieldLogger, config *rest.Config) (*accessclient.Clientset, error) {
log.Debugln("Building SMI Access Client...")

client, err := accessClient.NewForConfig(config)
client, err := accessclient.NewForConfig(config)
if err != nil {
return nil, fmt.Errorf("unable to create SMI Access Client: %v", err)
}
Expand All @@ -111,10 +111,10 @@ func buildSmiAccessClient(log logrus.FieldLogger, config *rest.Config) (*accessC
}

// buildSmiSpecsClient returns a client to manage SMI Specs objects.
func buildSmiSpecsClient(log logrus.FieldLogger, config *rest.Config) (*specsClient.Clientset, error) {
func buildSmiSpecsClient(log logrus.FieldLogger, config *rest.Config) (*specsclient.Clientset, error) {
log.Debugln("Building SMI Specs Client...")

client, err := specsClient.NewForConfig(config)
client, err := specsclient.NewForConfig(config)
if err != nil {
return nil, fmt.Errorf("unable to create SMI Specs Client: %v", err)
}
Expand All @@ -123,10 +123,10 @@ func buildSmiSpecsClient(log logrus.FieldLogger, config *rest.Config) (*specsCli
}

// buildSmiSplitClient returns a client to manage SMI Split objects.
func buildSmiSplitClient(log logrus.FieldLogger, config *rest.Config) (*splitClient.Clientset, error) {
func buildSmiSplitClient(log logrus.FieldLogger, config *rest.Config) (*splitclient.Clientset, error) {
log.Debugln("Building SMI Split Client...")

client, err := splitClient.NewForConfig(config)
client, err := splitclient.NewForConfig(config)
if err != nil {
return nil, fmt.Errorf("unable to create SMI Split Client: %v", err)
}
Expand Down
72 changes: 36 additions & 36 deletions pkg/k8s/client_mock.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,22 +11,22 @@ import (
access "github.com/servicemeshinterface/smi-sdk-go/pkg/apis/access/v1alpha1"
specs "github.com/servicemeshinterface/smi-sdk-go/pkg/apis/specs/v1alpha1"
split "github.com/servicemeshinterface/smi-sdk-go/pkg/apis/split/v1alpha2"
accessClient "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/access/clientset/versioned"
fakeAccessClient "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/access/clientset/versioned/fake"
accessInformer "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/access/informers/externalversions"
accessLister "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/access/listers/access/v1alpha1"
specsClient "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/specs/clientset/versioned"
fakeSpecsClient "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/specs/clientset/versioned/fake"
specsInformer "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/specs/informers/externalversions"
specsLister "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/specs/listers/specs/v1alpha1"
splitClient "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/split/clientset/versioned"
fakeSplitClient "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/split/clientset/versioned/fake"
splitInformer "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/split/informers/externalversions"
splitLister "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/split/listers/split/v1alpha2"
accessclient "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/access/clientset/versioned"
fakeaccessclient "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/access/clientset/versioned/fake"
accessinformer "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/access/informers/externalversions"
accesslister "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/access/listers/access/v1alpha1"
specsclient "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/specs/clientset/versioned"
fakespecsclient "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/specs/clientset/versioned/fake"
specsinformer "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/specs/informers/externalversions"
specslister "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/specs/listers/specs/v1alpha1"
splitclient "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/split/clientset/versioned"
fakesplitclient "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/split/clientset/versioned/fake"
splitinformer "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/split/informers/externalversions"
splitlister "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/split/listers/split/v1alpha2"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/informers"
kubeClient "k8s.io/client-go/kubernetes"
fakeKubeClient "k8s.io/client-go/kubernetes/fake"
kubeclient "k8s.io/client-go/kubernetes"
fakekubeclient "k8s.io/client-go/kubernetes/fake"
"k8s.io/client-go/kubernetes/scheme"
listers "k8s.io/client-go/listers/core/v1"
"k8s.io/client-go/tools/cache"
Expand Down Expand Up @@ -60,24 +60,24 @@ func init() {

// ClientMock holds mock client.
type ClientMock struct {
kubeClient *fakeKubeClient.Clientset
accessClient *fakeAccessClient.Clientset
specsClient *fakeSpecsClient.Clientset
splitClient *fakeSplitClient.Clientset
kubeClient *fakekubeclient.Clientset
accessClient *fakeaccessclient.Clientset
specsClient *fakespecsclient.Clientset
splitClient *fakesplitclient.Clientset

informerFactory informers.SharedInformerFactory
accessInformerFactory accessInformer.SharedInformerFactory
specsInformerFactory specsInformer.SharedInformerFactory
splitInformerFactory splitInformer.SharedInformerFactory
accessInformerFactory accessinformer.SharedInformerFactory
specsInformerFactory specsinformer.SharedInformerFactory
splitInformerFactory splitinformer.SharedInformerFactory

PodLister listers.PodLister
ServiceLister listers.ServiceLister
EndpointsLister listers.EndpointsLister
NamespaceLister listers.NamespaceLister
TrafficTargetLister accessLister.TrafficTargetLister
HTTPRouteGroupLister specsLister.HTTPRouteGroupLister
TCPRouteLister specsLister.TCPRouteLister
TrafficSplitLister splitLister.TrafficSplitLister
TrafficTargetLister accesslister.TrafficTargetLister
HTTPRouteGroupLister specslister.HTTPRouteGroupLister
TCPRouteLister specslister.TCPRouteLister
TrafficSplitLister splitlister.TrafficSplitLister
}

// NewClientMock create a new client mock.
Expand All @@ -90,7 +90,7 @@ func NewClientMock(stopCh <-chan struct{}, path string, smi bool) *ClientMock {
k8sObjects := MustParseYaml(yamlContent)
c := &ClientMock{}

c.kubeClient = fakeKubeClient.NewSimpleClientset(filterObjectsByKind(k8sObjects, CoreObjectKinds)...)
c.kubeClient = fakekubeclient.NewSimpleClientset(filterObjectsByKind(k8sObjects, CoreObjectKinds)...)

c.informerFactory = informers.NewSharedInformerFactory(c.kubeClient, 0)

Expand Down Expand Up @@ -119,13 +119,13 @@ func NewClientMock(stopCh <-chan struct{}, path string, smi bool) *ClientMock {
}

if smi {
c.accessClient = fakeAccessClient.NewSimpleClientset(filterObjectsByKind(k8sObjects, AccessObjectKinds)...)
c.specsClient = fakeSpecsClient.NewSimpleClientset(filterObjectsByKind(k8sObjects, SpecsObjectKinds)...)
c.splitClient = fakeSplitClient.NewSimpleClientset(filterObjectsByKind(k8sObjects, SplitObjectKinds)...)
c.accessClient = fakeaccessclient.NewSimpleClientset(filterObjectsByKind(k8sObjects, AccessObjectKinds)...)
c.specsClient = fakespecsclient.NewSimpleClientset(filterObjectsByKind(k8sObjects, SpecsObjectKinds)...)
c.splitClient = fakesplitclient.NewSimpleClientset(filterObjectsByKind(k8sObjects, SplitObjectKinds)...)

c.accessInformerFactory = accessInformer.NewSharedInformerFactory(c.accessClient, 0)
c.specsInformerFactory = specsInformer.NewSharedInformerFactory(c.specsClient, 0)
c.splitInformerFactory = splitInformer.NewSharedInformerFactory(c.splitClient, 0)
c.accessInformerFactory = accessinformer.NewSharedInformerFactory(c.accessClient, 0)
c.specsInformerFactory = specsinformer.NewSharedInformerFactory(c.specsClient, 0)
c.splitInformerFactory = splitinformer.NewSharedInformerFactory(c.splitClient, 0)

trafficTargetInformer := c.accessInformerFactory.Access().V1alpha1().TrafficTargets().Informer()
httpRouteGroupInformer := c.specsInformerFactory.Specs().V1alpha1().HTTPRouteGroups().Informer()
Expand Down Expand Up @@ -170,22 +170,22 @@ func NewClientMock(stopCh <-chan struct{}, path string, smi bool) *ClientMock {
}

// GetKubernetesClient is used to get the kubernetes clientset.
func (c *ClientMock) GetKubernetesClient() kubeClient.Interface {
func (c *ClientMock) GetKubernetesClient() kubeclient.Interface {
return c.kubeClient
}

// GetAccessClient is used to get the SMI Access clientset.
func (c *ClientMock) GetAccessClient() accessClient.Interface {
func (c *ClientMock) GetAccessClient() accessclient.Interface {
return c.accessClient
}

// GetSpecsClient is used to get the SMI Specs clientset.
func (c *ClientMock) GetSpecsClient() specsClient.Interface {
func (c *ClientMock) GetSpecsClient() specsclient.Interface {
return c.specsClient
}

// GetSplitClient is used to get the SMI Split clientset.
func (c *ClientMock) GetSplitClient() splitClient.Interface {
func (c *ClientMock) GetSplitClient() splitclient.Interface {
return c.splitClient
}

Expand Down
12 changes: 6 additions & 6 deletions pkg/prepare/prepare.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ import (
"github.com/containous/maesh/pkg/k8s"
"github.com/containous/traefik/v2/pkg/safe"
"github.com/google/uuid"
accessInformer "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/access/informers/externalversions"
specsInformer "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/specs/informers/externalversions"
splitInformer "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/split/informers/externalversions"
accessinformer "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/access/informers/externalversions"
specsinformer "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/specs/informers/externalversions"
splitinformer "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/split/informers/externalversions"
"github.com/sirupsen/logrus"
appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
Expand Down Expand Up @@ -386,7 +386,7 @@ func (p *Prepare) StartInformers(acl bool) error {
}
}

splitFactory := splitInformer.NewSharedInformerFactoryWithOptions(p.client.GetSplitClient(), k8s.ResyncPeriod)
splitFactory := splitinformer.NewSharedInformerFactoryWithOptions(p.client.GetSplitClient(), k8s.ResyncPeriod)
splitFactory.Split().V1alpha2().TrafficSplits().Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{})
splitFactory.Start(stopCh)

Expand All @@ -398,7 +398,7 @@ func (p *Prepare) StartInformers(acl bool) error {

if acl {
// Create new SharedInformerFactories, and register the event handler to informers.
accessFactory := accessInformer.NewSharedInformerFactoryWithOptions(p.client.GetAccessClient(), k8s.ResyncPeriod)
accessFactory := accessinformer.NewSharedInformerFactoryWithOptions(p.client.GetAccessClient(), k8s.ResyncPeriod)
accessFactory.Access().V1alpha1().TrafficTargets().Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{})
accessFactory.Start(stopCh)

Expand All @@ -408,7 +408,7 @@ func (p *Prepare) StartInformers(acl bool) error {
}
}

specsFactory := specsInformer.NewSharedInformerFactoryWithOptions(p.client.GetSpecsClient(), k8s.ResyncPeriod)
specsFactory := specsinformer.NewSharedInformerFactoryWithOptions(p.client.GetSpecsClient(), k8s.ResyncPeriod)
specsFactory.Specs().V1alpha1().HTTPRouteGroups().Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{})
specsFactory.Specs().V1alpha1().TCPRoutes().Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{})
specsFactory.Start(stopCh)
Expand Down

0 comments on commit 00b3cd6

Please sign in to comment.