Skip to content

Commit 772ad22

Browse files
committed
allow circuitrelay to be configured using a private swarm key
Signed-off-by: Oleg S <[email protected]>
1 parent f19fc4f commit 772ad22

13 files changed

+125
-354
lines changed

Dockerfile

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
# Build the manager binary
22
FROM golang:1.18 as builder
33

4+
# these are reasonable defaults which accommodate 90% of cases
5+
ARG arch=amd64
6+
ARG platform=linux
7+
48
WORKDIR /workspace
59
# Copy the Go Modules manifests
610
COPY go.mod go.mod
@@ -15,7 +19,7 @@ COPY api/ api/
1519
COPY controllers/ controllers/
1620

1721
# Build
18-
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -o manager main.go
22+
RUN CGO_ENABLED=0 GOOS=${platform} GOARCH=${arch} go build -a -o manager main.go
1923

2024
# Use distroless as minimal base image to package the manager binary
2125
# Refer to https://github.com/GoogleContainerTools/distroless for more details

Makefile

+2-1
Original file line numberDiff line numberDiff line change
@@ -158,8 +158,9 @@ run: manifests generate fmt vet ## Run a controller from your host.
158158
go run ./main.go
159159

160160
.PHONY: docker-build
161+
# docker build -t ${IMG} . --build-arg arch=$(ARCH) --build-arg platform=$(OS)
161162
docker-build: ## Build docker image with the manager.
162-
docker build -t ${IMG} .
163+
docker build -t ${IMG} .
163164

164165
.PHONY: docker-push
165166
docker-push: ## Push docker image with the manager.

README.md

+10
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,13 @@ Once the values match your environment run the following.
3030
```bash
3131
kubectl create -n default -f ifps.yaml
3232
```
33+
34+
### Running in KIND
35+
36+
An easy way to test and modify changes to the operator is by running it in a local KIND cluster.
37+
To bootstrap a KIND cluster, you can run `hack/setup-kind-cluster.sh`, which will install all of the
38+
required components to operate an IPFS cluster.
39+
40+
To deploy the operator in this repository into the cluster, you can run `hack/run-in-kind.sh` which
41+
will build the source code and inject it into the cluster.
42+
If you make subsequent changes, you will need to re-run `hack/run-in-kind.sh` in order to redeploy local changes.

bundle/manifests/ipfs-operator.clusterserviceversion.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ metadata:
2222
}
2323
]
2424
capabilities: Basic Install
25-
createdAt: "2023-02-06T16:25:33Z"
25+
createdAt: "2023-02-07T20:51:55Z"
2626
operators.operatorframework.io/builder: operator-sdk-v1.26.0
2727
operators.operatorframework.io/project_layout: go.kubebuilder.io/v3
2828
name: ipfs-operator.v0.0.1

controllers/circuitrelay.go

+84
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package controllers
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
clusterv1alpha1 "github.com/redhat-et/ipfs-operator/api/v1alpha1"
8+
corev1 "k8s.io/api/core/v1"
9+
ctrl "sigs.k8s.io/controller-runtime"
10+
"sigs.k8s.io/controller-runtime/pkg/client"
11+
"sigs.k8s.io/controller-runtime/pkg/log"
12+
ctrllog "sigs.k8s.io/controller-runtime/pkg/log"
13+
)
14+
15+
func (r *IpfsClusterReconciler) EnsureCircuitRelay(ctx context.Context, m *clusterv1alpha1.IpfsCluster, secret *corev1.Secret) (err error) {
16+
log := ctrllog.FromContext(ctx)
17+
if err = r.createCircuitRelays(ctx, m, secret); err != nil {
18+
return fmt.Errorf("cannot create circuit relays: %w", err)
19+
}
20+
// Check the status of circuit relays.
21+
// wait for them to complte so we can determine announce addresses.
22+
for _, relayName := range m.Status.CircuitRelays {
23+
relay := clusterv1alpha1.CircuitRelay{}
24+
relay.Name = relayName
25+
relay.Namespace = m.Namespace
26+
if err = r.Client.Get(ctx, client.ObjectKeyFromObject(&relay), &relay); err != nil {
27+
return fmt.Errorf("could not lookup circuitRelay %q: %w", relayName, err)
28+
}
29+
if relay.Status.AddrInfo.ID == "" {
30+
log.Info("relay is not ready yet. Will continue waiting.", "relay", relayName)
31+
return fmt.Errorf("relay is not ready yet")
32+
}
33+
}
34+
if err = r.Status().Update(ctx, m); err != nil {
35+
return err
36+
}
37+
return nil
38+
}
39+
40+
// createCircuitRelays Creates the necessary amount of circuit relays if any are missing.
41+
// FIXME: if we change the number of CircuitRelays, we should update
42+
// the IPFS config file as well.
43+
func (r *IpfsClusterReconciler) createCircuitRelays(
44+
ctx context.Context,
45+
instance *clusterv1alpha1.IpfsCluster,
46+
secret *corev1.Secret,
47+
) error {
48+
logger := log.FromContext(ctx, "context", "createCircuitRelays", "instance", instance)
49+
// do nothing
50+
if len(instance.Status.CircuitRelays) >= int(instance.Spec.Networking.CircuitRelays) {
51+
logger.Info("we have enough circuitRelays, skipping creation")
52+
// FIXME: handle scale-down of circuit relays
53+
return nil
54+
}
55+
logger.Info("creating more circuitRelays")
56+
// create the CircuitRelays
57+
for i := 0; int32(i) < instance.Spec.Networking.CircuitRelays; i++ {
58+
name := fmt.Sprintf("%s-%d", instance.Name, i)
59+
relay := clusterv1alpha1.CircuitRelay{}
60+
relay.Name = name
61+
relay.Namespace = instance.Namespace
62+
// include the private swarm key, if one is being provided
63+
if secret != nil {
64+
relay.Spec.SwarmKeyRef = &clusterv1alpha1.KeyRef{
65+
KeyName: KeySwarmKey,
66+
SecretName: secret.Name,
67+
}
68+
}
69+
if err := ctrl.SetControllerReference(instance, &relay, r.Scheme); err != nil {
70+
return fmt.Errorf(
71+
"cannot set controller reference for new circuitRelay: %w, circuitRelay: %s",
72+
err, relay.Name,
73+
)
74+
}
75+
if err := r.Create(ctx, &relay); err != nil {
76+
return fmt.Errorf("cannot create new circuitRelay: %w", err)
77+
}
78+
instance.Status.CircuitRelays = append(instance.Status.CircuitRelays, relay.Name)
79+
}
80+
if err := r.Status().Update(ctx, instance); err != nil {
81+
return err
82+
}
83+
return nil
84+
}

controllers/ipfscluster_controller.go

+3-57
Original file line numberDiff line numberDiff line change
@@ -84,28 +84,6 @@ func (r *IpfsClusterReconciler) Reconcile(ctx context.Context, req ctrl.Request)
8484
return ctrl.Result{}, r.Update(ctx, instance)
8585
}
8686

87-
if err = r.createCircuitRelays(ctx, instance); err != nil {
88-
return ctrl.Result{}, fmt.Errorf("cannot create circuit relays: %w", err)
89-
}
90-
91-
// Check the status of circuit relays.
92-
// wait for them to complte so we can determine announce addresses.
93-
for _, relayName := range instance.Status.CircuitRelays {
94-
relay := clusterv1alpha1.CircuitRelay{}
95-
relay.Name = relayName
96-
relay.Namespace = instance.Namespace
97-
if err = r.Client.Get(ctx, client.ObjectKeyFromObject(&relay), &relay); err != nil {
98-
return ctrl.Result{Requeue: true}, fmt.Errorf("could not lookup circuitRelay %q: %w", relayName, err)
99-
}
100-
if relay.Status.AddrInfo.ID == "" {
101-
log.Info("relay is not ready yet. Will continue waiting.", "relay", relayName)
102-
return failResult, nil
103-
}
104-
}
105-
if err = r.Status().Update(ctx, instance); err != nil {
106-
return ctrl.Result{}, err
107-
}
108-
10987
// Reconcile the tracked objects
11088
err = r.createTrackedObjects(ctx, instance)
11189
if err != nil {
@@ -137,6 +115,9 @@ func (r *IpfsClusterReconciler) createTrackedObjects(
137115
if secret, err = r.EnsureSecretConfig(ctx, instance); err != nil {
138116
return fmt.Errorf("failed to ensure secret config: %w", err)
139117
}
118+
if err = r.EnsureCircuitRelay(ctx, instance, secret); err != nil {
119+
return fmt.Errorf("failed to ensure circuit relays: %w", err)
120+
}
140121
if relayPeers, relayStatic, err = r.EnsureRelayCircuitInfo(ctx, instance); err != nil {
141122
return fmt.Errorf("could not retrieve information from the relay circuit: %w", err)
142123
}
@@ -178,41 +159,6 @@ func (r *IpfsClusterReconciler) ensureIPFSCluster(
178159
return nil, fmt.Errorf("failed to get Ipfs: %w", err)
179160
}
180161

181-
// createCircuitRelays Creates the necessary amount of circuit relays if any are missing.
182-
// FIXME: if we change the number of CircuitRelays, we should update
183-
// the IPFS config file as well.
184-
func (r *IpfsClusterReconciler) createCircuitRelays(
185-
ctx context.Context,
186-
instance *clusterv1alpha1.IpfsCluster,
187-
) error {
188-
// do nothing
189-
if len(instance.Status.CircuitRelays) >= int(instance.Spec.Networking.CircuitRelays) {
190-
// FIXME: handle scale-down of circuit relays
191-
return nil
192-
}
193-
// create the CircuitRelays
194-
for i := 0; int32(i) < instance.Spec.Networking.CircuitRelays; i++ {
195-
name := fmt.Sprintf("%s-%d", instance.Name, i)
196-
relay := clusterv1alpha1.CircuitRelay{}
197-
relay.Name = name
198-
relay.Namespace = instance.Namespace
199-
if err := ctrl.SetControllerReference(instance, &relay, r.Scheme); err != nil {
200-
return fmt.Errorf(
201-
"cannot set controller reference for new circuitRelay: %w, circuitRelay: %s",
202-
err, relay.Name,
203-
)
204-
}
205-
if err := r.Create(ctx, &relay); err != nil {
206-
return fmt.Errorf("cannot create new circuitRelay: %w", err)
207-
}
208-
instance.Status.CircuitRelays = append(instance.Status.CircuitRelays, relay.Name)
209-
}
210-
if err := r.Status().Update(ctx, instance); err != nil {
211-
return err
212-
}
213-
return nil
214-
}
215-
216162
// SetupWithManager sets up the controller with the Manager.
217163
func (r *IpfsClusterReconciler) SetupWithManager(mgr ctrl.Manager) error {
218164
return ctrl.NewControllerManagedBy(mgr).

controllers/scripts/config.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@ import (
44
"bytes"
55
"encoding/json"
66
"fmt"
7-
"log"
87
"math"
98
"strconv"
109
"text/template"
1110

1211
"github.com/alecthomas/units"
1312
"github.com/ipfs/kubo/config"
1413
"github.com/libp2p/go-libp2p/core/peer"
14+
"sigs.k8s.io/controller-runtime/pkg/log"
1515
)
1616

1717
type configureIpfsOpts struct {
@@ -175,10 +175,10 @@ func CreateConfigureScript(
175175
}
176176

177177
if bootstrapAddrs != nil {
178-
log.Printf("overriding bootstrap adders: %+v", bootstrapAddrs)
178+
log.Log.Info("overriding bootstrap addresses", "bootstrapAddrs", bootstrapAddrs)
179179
config.Bootstrap = bootstrapAddrs
180180
} else {
181-
log.Println("keeping bootstrap adders default")
181+
log.Log.Info("keeping bootstrap adders default")
182182
}
183183

184184
// convert config settings into json string

controllers/service.go

+5-4
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,22 @@ package controllers
33
import (
44
"context"
55
"fmt"
6-
"log"
76

87
corev1 "k8s.io/api/core/v1"
98
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
109
"k8s.io/apimachinery/pkg/util/intstr"
1110
ctrl "sigs.k8s.io/controller-runtime"
1211

1312
clusterv1alpha1 "github.com/redhat-et/ipfs-operator/api/v1alpha1"
13+
"sigs.k8s.io/controller-runtime/pkg/log"
1414
)
1515

1616
// ensureServiceCluster Returns the existing IPFS cluster service object or an error.
1717
func (r *IpfsClusterReconciler) ensureServiceCluster(
1818
ctx context.Context,
1919
m *clusterv1alpha1.IpfsCluster,
2020
) (*corev1.Service, error) {
21+
logger := log.FromContext(ctx)
2122
svcName := "ipfs-cluster-" + m.Name
2223
svc := &corev1.Service{
2324
ObjectMeta: metav1.ObjectMeta{
@@ -27,7 +28,7 @@ func (r *IpfsClusterReconciler) ensureServiceCluster(
2728
},
2829
}
2930

30-
log.Println("creating or updating svc")
31+
logger.Info("creating or updating svc")
3132
op, err := ctrl.CreateOrUpdate(ctx, r.Client, svc, func() error {
3233
svc.Spec = corev1.ServiceSpec{}
3334
svc.Spec.Ports = []corev1.ServicePort{
@@ -83,9 +84,9 @@ func (r *IpfsClusterReconciler) ensureServiceCluster(
8384
return nil
8485
})
8586
if err != nil {
86-
log.Printf("failed on operation %s\n", op)
87+
logger.Error(err, "failed on operation", "operation", op)
8788
return nil, fmt.Errorf("failed to create service: %w", err)
8889
}
89-
fmt.Printf("completed operation: %s\n", op)
90+
logger.Info("completed operation", "operation", op)
9091
return svc, nil
9192
}

controllers/serviceaccount.go

+6-4
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ package controllers
22

33
import (
44
"context"
5-
"log"
5+
6+
"sigs.k8s.io/controller-runtime/pkg/log"
67

78
clusterv1alpha1 "github.com/redhat-et/ipfs-operator/api/v1alpha1"
89
corev1 "k8s.io/api/core/v1"
@@ -13,7 +14,8 @@ import (
1314

1415
func (r *IpfsClusterReconciler) ensureSA(ctx context.Context, m *clusterv1alpha1.IpfsCluster) (*corev1.ServiceAccount,
1516
error) {
16-
log.Println("ensuring service account")
17+
logger := log.FromContext(ctx)
18+
logger.Info("ensuring service account")
1719
// Define a new Service Account object
1820
sa := &corev1.ServiceAccount{
1921
ObjectMeta: metav1.ObjectMeta{
@@ -28,9 +30,9 @@ func (r *IpfsClusterReconciler) ensureSA(ctx context.Context, m *clusterv1alpha1
2830
return nil
2931
})
3032
if err != nil {
31-
log.Printf("could not create serviceOrUpdate service account: %s\n", err.Error())
33+
logger.Error(err, "failed to create serviceaccount")
3234
return nil, err
3335
}
34-
log.Println("completed operation:", res)
36+
logger.Info("created serviceaccount", "result", res)
3537
return sa, nil
3638
}

helm/ipfs-operator/crds/CustomResourceDefinition-circuitrelays.cluster.ipfs.io.yaml

-64
This file was deleted.

0 commit comments

Comments
 (0)