Skip to content

Commit

Permalink
refactor: followup kubernetes/infrastruture refactoring. (#1337)
Browse files Browse the repository at this point in the history
* refactor: followup kubernetes/infrastruture refactoring.

Signed-off-by: qicz <[email protected]>

* fix lint

Signed-off-by: qicz <[email protected]>

* proxy using ir.ProxyInfra

Signed-off-by: qicz <[email protected]>

* refactor ratelimit resource render.

Signed-off-by: qicz <[email protected]>

* add infra resource update check logic

Signed-off-by: qicz <[email protected]>

* fix lint

Signed-off-by: qicz <[email protected]>

* typo

Signed-off-by: qicz <[email protected]>

* fix lint

Signed-off-by: qicz <[email protected]>

---------

Signed-off-by: qicz <[email protected]>
  • Loading branch information
qicz authored Apr 25, 2023
1 parent 29ef454 commit 4adbc2a
Show file tree
Hide file tree
Showing 24 changed files with 335 additions and 394 deletions.
187 changes: 0 additions & 187 deletions internal/infrastructure/kubernetes/applier/apply.go

This file was deleted.

129 changes: 16 additions & 113 deletions internal/infrastructure/kubernetes/infra.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,13 @@ package kubernetes
import (
"context"

"github.com/pkg/errors"
appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"sigs.k8s.io/controller-runtime/pkg/client"

"github.com/envoyproxy/gateway/api/config/v1alpha1"
"github.com/envoyproxy/gateway/internal/envoygateway/config"
"github.com/envoyproxy/gateway/internal/infrastructure/kubernetes/applier"
"github.com/envoyproxy/gateway/internal/infrastructure/kubernetes/proxy"
"github.com/envoyproxy/gateway/internal/infrastructure/kubernetes/ratelimit"
)

var (
_ ResourceRender = &proxy.ResourceRender{}
_ ResourceRender = &ratelimit.ResourceRender{}
)

// ResourceRender renders Kubernetes infrastructure resources
Expand All @@ -38,153 +30,64 @@ type ResourceRender interface {
// Infra manages the creation and deletion of Kubernetes infrastructure
// based on Infra IR resources.
type Infra struct {
Client client.Client

// Namespace is the Namespace used for managed infra.
Namespace string

// EnvoyGateway is the configuration used to startup Envoy Gateway.
EnvoyGateway *v1alpha1.EnvoyGateway
applier *applier.Instance

// Client wrap k8s client.
Client *InfraClient
}

// NewInfra returns a new Infra.
func NewInfra(cli client.Client, cfg *config.Server) *Infra {
return &Infra{
Client: cli,
Namespace: cfg.Namespace,
EnvoyGateway: cfg.EnvoyGateway,
applier: applier.New(cli),
Client: New(cli),
}
}

// createOrUpdate creates a ServiceAccount/ConfigMap/Deployment/Service in the kube api server based on the
// provided ResourceRender, if it doesn't exist and updates it if it does.
func (i *Infra) createOrUpdate(ctx context.Context, r ResourceRender) error {
if err := i.createOrUpdateServiceAccount(ctx, r); err != nil {
return err
return errors.Wrapf(err, "failed to create or update serviceaccount %s/%s", i.Namespace, r.Name())
}

if err := i.createOrUpdateConfigMap(ctx, r); err != nil {
return err
return errors.Wrapf(err, "failed to create or update configmap %s/%s", i.Namespace, r.Name())
}

if err := i.createOrUpdateDeployment(ctx, r); err != nil {
return err
return errors.Wrapf(err, "failed to create or update deployment %s/%s", i.Namespace, r.Name())
}

if err := i.createOrUpdateService(ctx, r); err != nil {
return err
return errors.Wrapf(err, "failed to create or update service %s/%s", i.Namespace, r.Name())
}

return nil
}

// createOrUpdateServiceAccount creates a ServiceAccount in the kube api server based on the
// provided ResourceRender, if it doesn't exist and updates it if it does.
func (i *Infra) createOrUpdateServiceAccount(ctx context.Context, r ResourceRender) error {
sa, err := r.ServiceAccount()
if err != nil {
return err
}
return i.applier.CreateOrUpdateServiceAccount(ctx, sa)
}

// createOrUpdateConfigMap creates a ConfigMap in the Kube api server based on the provided
// ResourceRender, if it doesn't exist and updates it if it does.
func (i *Infra) createOrUpdateConfigMap(ctx context.Context, r ResourceRender) error {
cm, err := r.ConfigMap()
if err != nil {
return err
}

return i.applier.CreateOrUpdateConfigMap(ctx, cm)
}

// createOrUpdateDeployment creates a Deployment in the kube api server based on the provided
// ResourceRender, if it doesn't exist and updates it if it does.
func (i *Infra) createOrUpdateDeployment(ctx context.Context, r ResourceRender) error {
deployment, err := r.Deployment()
if err != nil {
return err
}
return i.applier.CreateOrUpdateDeployment(ctx, deployment)
}

// createOrUpdateRateLimitService creates a Service in the kube api server based on the provided ResourceRender,
// if it doesn't exist or updates it if it does.
func (i *Infra) createOrUpdateService(ctx context.Context, r ResourceRender) error {
svc, err := r.Service()
if err != nil {
return err
}

return i.applier.CreateOrUpdateService(ctx, svc)
}

// delete deletes the ServiceAccount/ConfigMap/Deployment/Service in the kube api server, if it exists.
func (i *Infra) delete(ctx context.Context, r ResourceRender) error {
if err := i.deleteServiceAccount(ctx, r); err != nil {
return err
return errors.Wrapf(err, "failed to delete serviceaccount %s/%s", i.Namespace, r.Name())
}

if err := i.deleteConfigMap(ctx, r); err != nil {
return err
return errors.Wrapf(err, "failed to delete configmap %s/%s", i.Namespace, r.Name())
}

if err := i.deleteDeployment(ctx, r); err != nil {
return err
return errors.Wrapf(err, "failed to delete deployment %s/%s", i.Namespace, r.Name())
}

if err := i.deleteService(ctx, r); err != nil {
return err
return errors.Wrapf(err, "failed to delete service %s/%s", i.Namespace, r.Name())
}

return nil
}

// deleteServiceAccount deletes the ServiceAccount in the kube api server,
// if it exists.
func (i *Infra) deleteServiceAccount(ctx context.Context, r ResourceRender) error {
sa := &corev1.ServiceAccount{
ObjectMeta: metav1.ObjectMeta{
Namespace: i.Namespace,
Name: r.Name(),
},
}

return i.applier.DeleteServiceAccount(ctx, sa)
}

// deleteDeployment deletes the Envoy Deployment in the kube api server, if it exists.
func (i *Infra) deleteDeployment(ctx context.Context, r ResourceRender) error {
deploy := &appsv1.Deployment{
ObjectMeta: metav1.ObjectMeta{
Namespace: i.Namespace,
Name: r.Name(),
},
}

return i.applier.DeleteDeployment(ctx, deploy)
}

// deleteConfigMap deletes the ConfigMap in the kube api server, if it exists.
func (i *Infra) deleteConfigMap(ctx context.Context, r ResourceRender) error {
cm := &corev1.ConfigMap{
ObjectMeta: metav1.ObjectMeta{
Namespace: i.Namespace,
Name: r.Name(),
},
}

return i.applier.DeleteConfigMap(ctx, cm)
}

// deleteService deletes the Service in the kube api server, if it exists.
func (i *Infra) deleteService(ctx context.Context, r ResourceRender) error {
svc := &corev1.Service{
ObjectMeta: metav1.ObjectMeta{
Namespace: i.Namespace,
Name: r.Name(),
},
}

return i.applier.DeleteService(ctx, svc)
}
Loading

0 comments on commit 4adbc2a

Please sign in to comment.