Skip to content

Commit 82a3aeb

Browse files
committed
allow certificates to be managed in LB compartment
1 parent 9987b18 commit 82a3aeb

File tree

14 files changed

+147
-74
lines changed

14 files changed

+147
-74
lines changed

helm/oci-native-ingress-controller/templates/deployment.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ spec:
6868
- --metrics-backend={{.Values.metrics.backend}}
6969
- --metrics-port={{.Values.metrics.port}}
7070
- --v=4
71+
- --use-lb-compartment-for-certificates={{ .Values.useLbCompartmentForCertificates }}
7172
env:
7273
- name: OCI_RESOURCE_PRINCIPAL_VERSION
7374
value: "2.2"

helm/oci-native-ingress-controller/values.yaml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,4 +122,7 @@ objectSelector:
122122

123123
metrics:
124124
backend: prometheus
125-
port: 2223
125+
port: 2223
126+
127+
# Use the compartment supplied in IngressClassParam.spec.compartmentId for certificate management
128+
useLbCompartmentForCertificates: false

main.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ func main() {
5959
flag.StringVar(&opts.AuthSecretName, "auth-secret-name", "", "Secret name used for auth, cannot be empty if authType is user principal")
6060
flag.StringVar(&opts.MetricsBackend, "metrics-backend", "prometheus", "Backend used for metrics")
6161
flag.IntVar(&opts.MetricsPort, "metrics-port", 2223, "Metrics port for metrics backend")
62+
flag.BoolVar(&opts.UseLbCompartmentForCertificates, "use-lb-compartment-for-certificates", false,
63+
"use the compartment supplied in IngressClassParam.spec.compartmentId for certificate management")
6264

6365
var logFile string
6466
flag.StringVar(&logFile, "log-file", "", "absolute path to the file where application logs will be stored")
@@ -107,6 +109,10 @@ func main() {
107109
}
108110
}
109111

112+
if opts.UseLbCompartmentForCertificates {
113+
klog.Info("use-lb-compartment-for-certificates flag set to true, will use LB compartment for certificate management")
114+
}
115+
110116
// leader election uses the Kubernetes API by writing to a
111117
// lock object, which can be a LeaseLock object (preferred),
112118
// a ConfigMap, or an Endpoints (deprecated) object.

pkg/certificate/certificate.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ func (certificatesClient *CertificatesClient) GetFromCaBundleCache(id string) *C
7373

7474
func (certificatesClient *CertificatesClient) CreateCertificate(ctx context.Context,
7575
req certificatesmanagement.CreateCertificateRequest) (*certificatesmanagement.Certificate, string, error) {
76+
klog.Infof("Creating certicate %s in compartment %s", *req.Name, *req.CompartmentId)
7677
resp, err := certificatesClient.ManagementClient.CreateCertificate(ctx, req)
7778
if err != nil {
7879
klog.Errorf("Error creating certificate %s, %s ", *req.Name, err.Error())
@@ -84,6 +85,7 @@ func (certificatesClient *CertificatesClient) CreateCertificate(ctx context.Cont
8485

8586
func (certificatesClient *CertificatesClient) CreateCaBundle(ctx context.Context,
8687
req certificatesmanagement.CreateCaBundleRequest) (*certificatesmanagement.CaBundle, string, error) {
88+
klog.Infof("Creating cabundle %s in compartment %s", *req.Name, *req.CompartmentId)
8789
resp, err := certificatesClient.ManagementClient.CreateCaBundle(ctx, req)
8890
if err != nil {
8991
klog.Errorf("Error creating ca bundle %s, %s ", *req.Name, err.Error())

pkg/certificate/certificate_test.go

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,13 @@ func TestCertificatesClient_Cache(t *testing.T) {
3838
client := setup()
3939

4040
request := certificatesmanagement.CreateCertificateRequest{
41-
CreateCertificateDetails: certificatesmanagement.CreateCertificateDetails{},
42-
OpcRequestId: nil,
43-
OpcRetryToken: nil,
44-
RequestMetadata: common.RequestMetadata{},
41+
CreateCertificateDetails: certificatesmanagement.CreateCertificateDetails{
42+
Name: common.String("certificate-name"),
43+
CompartmentId: common.String("compartment-id"),
44+
},
45+
OpcRequestId: nil,
46+
OpcRetryToken: nil,
47+
RequestMetadata: common.RequestMetadata{},
4548
}
4649
cert, _, err := client.CreateCertificate(context.TODO(), request)
4750
Expect(err).Should(BeNil())
@@ -54,10 +57,13 @@ func TestCertificatesClient_CreateCertificate(t *testing.T) {
5457
client := setup()
5558

5659
request := certificatesmanagement.CreateCertificateRequest{
57-
CreateCertificateDetails: certificatesmanagement.CreateCertificateDetails{},
58-
OpcRequestId: nil,
59-
OpcRetryToken: nil,
60-
RequestMetadata: common.RequestMetadata{},
60+
CreateCertificateDetails: certificatesmanagement.CreateCertificateDetails{
61+
Name: common.String("certificate-name"),
62+
CompartmentId: common.String("compartment-id"),
63+
},
64+
OpcRequestId: nil,
65+
OpcRetryToken: nil,
66+
RequestMetadata: common.RequestMetadata{},
6167
}
6268
cert, _, err := client.CreateCertificate(context.TODO(), request)
6369
Expect(err).Should(BeNil())
@@ -70,10 +76,13 @@ func TestCertificatesClient_CreateCaBundle(t *testing.T) {
7076
client := setup()
7177

7278
request := certificatesmanagement.CreateCaBundleRequest{
73-
CreateCaBundleDetails: certificatesmanagement.CreateCaBundleDetails{},
74-
OpcRequestId: nil,
75-
OpcRetryToken: nil,
76-
RequestMetadata: common.RequestMetadata{},
79+
CreateCaBundleDetails: certificatesmanagement.CreateCaBundleDetails{
80+
Name: common.String("cabundle-name"),
81+
CompartmentId: common.String("compartment-id"),
82+
},
83+
OpcRequestId: nil,
84+
OpcRetryToken: nil,
85+
RequestMetadata: common.RequestMetadata{},
7786
}
7887
cert, _, err := client.CreateCaBundle(context.TODO(), request)
7988
Expect(err).Should(BeNil())

pkg/controllers/ingress/certificate_util.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ func CreateImportedTypeCertificate(tlsSecretData *TLSSecretData, certificateName
107107
}
108108
createCertificateRequest := certificatesmanagement.CreateCertificateRequest{
109109
CreateCertificateDetails: certificateDetails,
110-
OpcRetryToken: &certificateName,
110+
OpcRetryToken: common.String(hashStringShort(common.String(certificateName + compartmentId))),
111111
}
112112

113113
createCertificate, etag, err := certificatesClient.CreateCertificate(context.TODO(), createCertificateRequest)
@@ -316,7 +316,7 @@ func CreateCaBundle(certificateName string, compartmentId string, certificatesCl
316316
}
317317
createCaBundleRequest := certificatesmanagement.CreateCaBundleRequest{
318318
CreateCaBundleDetails: caBundleDetails,
319-
OpcRetryToken: &certificateName,
319+
OpcRetryToken: common.String(hashStringShort(common.String(certificateName + compartmentId))),
320320
}
321321
createCaBundle, etag, err := certificatesClient.CreateCaBundle(context.TODO(), createCaBundleRequest)
322322
if err != nil {

pkg/controllers/ingress/ingress.go

Lines changed: 46 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"k8s.io/apimachinery/pkg/labels"
1818
coreinformers "k8s.io/client-go/informers/core/v1"
1919
"reflect"
20+
ctrcache "sigs.k8s.io/controller-runtime/pkg/cache"
2021
"time"
2122

2223
"github.com/oracle/oci-native-ingress-controller/pkg/client"
@@ -54,36 +55,39 @@ type Controller struct {
5455
controllerClass string
5556
defaultCompartmentId string
5657

57-
ingressClassLister networkinglisters.IngressClassLister
58-
ingressLister networkinglisters.IngressLister
59-
serviceLister corelisters.ServiceLister
60-
saLister corelisters.ServiceAccountLister
61-
secretLister corelisters.SecretLister
62-
queue workqueue.RateLimitingInterface
63-
informer networkinginformers.IngressInformer
64-
client *client.ClientProvider
65-
metricsCollector *metric.IngressCollector
58+
ingressClassLister networkinglisters.IngressClassLister
59+
ingressLister networkinglisters.IngressLister
60+
serviceLister corelisters.ServiceLister
61+
saLister corelisters.ServiceAccountLister
62+
secretLister corelisters.SecretLister
63+
queue workqueue.RateLimitingInterface
64+
informer networkinginformers.IngressInformer
65+
client *client.ClientProvider
66+
metricsCollector *metric.IngressCollector
67+
ctrCache ctrcache.Cache
68+
useLbCompartmentForCertificates bool
6669
}
6770

6871
// NewController creates a new Controller.
6972
func NewController(controllerClass string, defaultCompartmentId string,
7073
ingressClassInformer networkinginformers.IngressClassInformer, ingressInformer networkinginformers.IngressInformer,
7174
saInformer coreinformers.ServiceAccountInformer, serviceLister corelisters.ServiceLister, secretInformer coreinformers.SecretInformer,
72-
client *client.ClientProvider,
73-
reg *prometheus.Registry) *Controller {
75+
client *client.ClientProvider, reg *prometheus.Registry, ctrCache ctrcache.Cache, useLbCompartmentForCertificates bool) *Controller {
7476

7577
c := &Controller{
76-
controllerClass: controllerClass,
77-
defaultCompartmentId: defaultCompartmentId,
78-
ingressClassLister: ingressClassInformer.Lister(),
79-
ingressLister: ingressInformer.Lister(),
80-
informer: ingressInformer,
81-
serviceLister: serviceLister,
82-
saLister: saInformer.Lister(),
83-
secretLister: secretInformer.Lister(),
84-
client: client,
85-
queue: workqueue.NewRateLimitingQueue(workqueue.NewItemExponentialFailureRateLimiter(10*time.Second, 5*time.Minute)),
86-
metricsCollector: metric.NewIngressCollector(controllerClass, reg),
78+
controllerClass: controllerClass,
79+
defaultCompartmentId: defaultCompartmentId,
80+
ingressClassLister: ingressClassInformer.Lister(),
81+
ingressLister: ingressInformer.Lister(),
82+
informer: ingressInformer,
83+
serviceLister: serviceLister,
84+
saLister: saInformer.Lister(),
85+
secretLister: secretInformer.Lister(),
86+
client: client,
87+
queue: workqueue.NewRateLimitingQueue(workqueue.NewItemExponentialFailureRateLimiter(10*time.Second, 5*time.Minute)),
88+
metricsCollector: metric.NewIngressCollector(controllerClass, reg),
89+
ctrCache: ctrCache,
90+
useLbCompartmentForCertificates: useLbCompartmentForCertificates,
8791
}
8892

8993
ingressInformer.Informer().AddEventHandler(
@@ -357,6 +361,16 @@ func (c *Controller) ensureLoadBalancerIP(ctx context.Context, lbID string, ingr
357361
func (c *Controller) ensureIngress(ctx context.Context, ingress *networkingv1.Ingress, ingressClass *networkingv1.IngressClass) error {
358362

359363
klog.Infof("Processing ingress %s/%s", ingressClass.Name, ingress.Name)
364+
365+
certificateCompartmentId := c.defaultCompartmentId
366+
if c.useLbCompartmentForCertificates {
367+
ingressClassParameters, err := util.GetIngressClassParameters(ingressClass, c.ctrCache)
368+
if err != nil {
369+
return err
370+
}
371+
certificateCompartmentId = util.GetIngressClassCompartmentId(ingressClassParameters, c.defaultCompartmentId)
372+
}
373+
360374
stateStore := state.NewStateStore(c.ingressClassLister, c.ingressLister, c.serviceLister, c.metricsCollector)
361375
ingressConfigError := stateStore.BuildState(ingressClass)
362376

@@ -384,7 +398,7 @@ func (c *Controller) ensureIngress(ctx context.Context, ingress *networkingv1.In
384398
for bsName := range lb.BackendSets {
385399
actualBackendSets.Insert(bsName)
386400

387-
err = syncBackendSet(ctx, ingress, lbId, bsName, stateStore, c)
401+
err = syncBackendSet(ctx, ingress, lbId, bsName, stateStore, certificateCompartmentId, c)
388402
if err != nil {
389403
return err
390404
}
@@ -396,7 +410,7 @@ func (c *Controller) ensureIngress(ctx context.Context, ingress *networkingv1.In
396410
startBuildTime := util.GetCurrentTimeInUnixMillis()
397411
klog.V(2).InfoS("creating backend set for ingress", "ingress", klog.KObj(ingress), "backendSetName", bsName)
398412
artifact, artifactType := stateStore.GetTLSConfigForBackendSet(bsName)
399-
backendSetSslConfig, err := GetSSLConfigForBackendSet(ingress.Namespace, artifactType, artifact, lb, bsName, c.defaultCompartmentId, c.secretLister, wrapperClient)
413+
backendSetSslConfig, err := GetSSLConfigForBackendSet(ingress.Namespace, artifactType, artifact, lb, bsName, certificateCompartmentId, c.secretLister, wrapperClient)
400414
if err != nil {
401415
return err
402416
}
@@ -418,7 +432,7 @@ func (c *Controller) ensureIngress(ctx context.Context, ingress *networkingv1.In
418432
for _, listener := range lb.Listeners {
419433
actualListenerPorts.Insert(int32(*listener.Port))
420434

421-
err := syncListener(ctx, ingress.Namespace, stateStore, &lbId, *listener.Name, c)
435+
err := syncListener(ctx, ingress.Namespace, stateStore, &lbId, *listener.Name, certificateCompartmentId, c)
422436
if err != nil {
423437
return err
424438
}
@@ -431,7 +445,7 @@ func (c *Controller) ensureIngress(ctx context.Context, ingress *networkingv1.In
431445

432446
var listenerSslConfig *ociloadbalancer.SslConfigurationDetails
433447
artifact, artifactType := stateStore.GetTLSConfigForListener(port)
434-
listenerSslConfig, err := GetSSLConfigForListener(ingress.Namespace, nil, artifactType, artifact, c.defaultCompartmentId, c.secretLister, wrapperClient)
448+
listenerSslConfig, err := GetSSLConfigForListener(ingress.Namespace, nil, artifactType, artifact, certificateCompartmentId, c.secretLister, wrapperClient)
435449
if err != nil {
436450
return err
437451
}
@@ -538,7 +552,8 @@ func deleteListeners(actualListeners sets.Int32, desiredListeners sets.Int32, lb
538552
return nil
539553
}
540554

541-
func syncListener(ctx context.Context, namespace string, stateStore *state.StateStore, lbId *string, listenerName string, c *Controller) error {
555+
func syncListener(ctx context.Context, namespace string, stateStore *state.StateStore, lbId *string,
556+
listenerName string, certificateCompartmentId string, c *Controller) error {
542557
startTime := util.GetCurrentTimeInUnixMillis()
543558
wrapperClient, ok := ctx.Value(util.WrapperClient).(*client.WrapperClient)
544559
if !ok {
@@ -558,7 +573,7 @@ func syncListener(ctx context.Context, namespace string, stateStore *state.State
558573
artifact, artifactType := stateStore.GetTLSConfigForListener(int32(*listener.Port))
559574
var sslConfig *ociloadbalancer.SslConfigurationDetails
560575
if artifact != "" {
561-
sslConfig, err = GetSSLConfigForListener(namespace, &listener, artifactType, artifact, c.defaultCompartmentId, c.secretLister, wrapperClient)
576+
sslConfig, err = GetSSLConfigForListener(namespace, &listener, artifactType, artifact, certificateCompartmentId, c.secretLister, wrapperClient)
562577
if err != nil {
563578
return err
564579
}
@@ -598,7 +613,8 @@ func syncListener(ctx context.Context, namespace string, stateStore *state.State
598613
return nil
599614
}
600615

601-
func syncBackendSet(ctx context.Context, ingress *networkingv1.Ingress, lbID string, backendSetName string, stateStore *state.StateStore, c *Controller) error {
616+
func syncBackendSet(ctx context.Context, ingress *networkingv1.Ingress, lbID string, backendSetName string,
617+
stateStore *state.StateStore, certificateCompartmentId string, c *Controller) error {
602618

603619
startTime := util.GetCurrentTimeInUnixMillis()
604620
wrapperClient, ok := ctx.Value(util.WrapperClient).(*client.WrapperClient)
@@ -617,7 +633,7 @@ func syncBackendSet(ctx context.Context, ingress *networkingv1.Ingress, lbID str
617633

618634
needsUpdate := false
619635
artifact, artifactType := stateStore.GetTLSConfigForBackendSet(*bs.Name)
620-
sslConfig, err := GetSSLConfigForBackendSet(ingress.Namespace, artifactType, artifact, lb, *bs.Name, c.defaultCompartmentId, c.secretLister, wrapperClient)
636+
sslConfig, err := GetSSLConfigForBackendSet(ingress.Namespace, artifactType, artifact, lb, *bs.Name, certificateCompartmentId, c.secretLister, wrapperClient)
621637
if err != nil {
622638
return err
623639
}

pkg/controllers/ingress/ingress_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ func inits(ctx context.Context, ingressClassList *networkingv1.IngressClassList,
9292
Cache: NewMockCacheStore(wrapperClient),
9393
}
9494
c := NewController("oci.oraclecloud.com/native-ingress-controller", "", ingressClassInformer,
95-
ingressInformer, saInformer, serviceLister, secretInformer, fakeClient, nil)
95+
ingressInformer, saInformer, serviceLister, secretInformer, fakeClient, nil, nil, false)
9696
return c
9797
}
9898

pkg/controllers/ingress/util.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,14 @@ func hashString(data *string) string {
8989
return hex.EncodeToString(h.Sum(nil))
9090
}
9191

92+
func hashStringShort(data *string) string {
93+
hash := hashString(data)
94+
if len(hash) > 32 {
95+
hash = hash[:32]
96+
}
97+
return hash
98+
}
99+
92100
func getTlsSecretContent(namespace string, secretName string, secretLister v1.SecretLister) (*TLSSecretData, error) {
93101
secret, err := secretLister.Secrets(namespace).Get(secretName)
94102
if err != nil {

pkg/controllers/ingress/util_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,22 @@ func TestHashPublicTlsData(t *testing.T) {
233233
Expect(hashPublicTlsData(&tlsData)).Should(Equal(hashedString))
234234
}
235235

236+
func TestHashString(t *testing.T) {
237+
RegisterTestingT(t)
238+
239+
testString := "test-string"
240+
hashedString := hashString(&testString)
241+
Expect(hashedString).Should(Equal("ffe65f1d98fafedea3514adc956c8ada5980c6c5d2552fd61f48401aefd5c00e"))
242+
}
243+
244+
func TestHashStringShort(t *testing.T) {
245+
RegisterTestingT(t)
246+
247+
testString := "test-string"
248+
hashedString := hashStringShort(&testString)
249+
Expect(hashedString).Should(Equal("ffe65f1d98fafedea3514adc956c8ada"))
250+
}
251+
236252
func TestGetSSLConfigForBackendSet(t *testing.T) {
237253
RegisterTestingT(t)
238254
c, lb, secretLister := initsUtil(&corev1.SecretList{

0 commit comments

Comments
 (0)