Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions Tiltfile
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,8 @@ docker_build('controller:latest', '.', only=[
local_resource('controller-gen', 'make generate', deps=['api/', 'hack/boilerplate.go.txt'])
local_resource('crds', 'make install', deps=['api/'])

provider = os.getenv('PROVIDER', 'openconfig')

manager = kustomize('config/develop')
manager = str(manager).replace('--provider=openconfig', '--provider={}'.format(provider))
manager = str(manager)

k8s_yaml(blob(manager))
k8s_resource('network-operator-controller-manager', resource_deps=['controller-gen'])
Expand Down
6 changes: 6 additions & 0 deletions api/core/v1alpha1/device_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,12 @@ type DeviceSpec struct {
// +required
Endpoint Endpoint `json:"endpoint"`

// Provider is the name of the responsible for reconciling the object connected to the device.
// ToDo: Make this a required field once we have multiple providers implemented.
// ToDo: make this of type uri e.g. nx.cisco.networking.metal.ironcore.dev
// +optional
Provider string `json:"provider,omitempty"`

// Provisioning is an optional configuration for the device provisioning process.
// It can be used to provide initial configuration templates or scripts that are applied during the device provisioning.
// +optional
Expand Down
3 changes: 3 additions & 0 deletions api/core/v1alpha1/groupversion_info.go
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,9 @@ const (
// ErrorReason indicates that an error occurred while reconciling the resource.
ErrorReason = "Error"

// ProviderNotFoundReason indicates that the provider specified in the resource's device.spec.provider field was not found.
ProviderNotFoundReason = "ProviderNotFound"

// WaitingForDependenciesReason indicates that the resource is waiting for its dependencies to be ready.
WaitingForDependenciesReason = "WaitingForDependencies"

Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

52 changes: 6 additions & 46 deletions cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,6 @@ import (
nxcontroller "github.com/ironcore-dev/network-operator/internal/controller/cisco/nx"
corecontroller "github.com/ironcore-dev/network-operator/internal/controller/core"
poolcontroller "github.com/ironcore-dev/network-operator/internal/controller/pool"
"github.com/ironcore-dev/network-operator/internal/provider"
"github.com/ironcore-dev/network-operator/internal/provisioning"
"github.com/ironcore-dev/network-operator/internal/resourcelock"
tftpserver "github.com/ironcore-dev/network-operator/internal/tftp"
Expand Down Expand Up @@ -94,7 +93,6 @@ func main() { //nolint:gocyclo
var tlsOpts []func(*tls.Config)
var watchNamespace string
var watchFilterValue string
var providerName string
var requeueInterval time.Duration
var heartbeatInterval time.Duration
var tftpPort int
Expand All @@ -120,7 +118,6 @@ func main() { //nolint:gocyclo
flag.BoolVar(&enableHTTP2, "enable-http2", false, "If set, HTTP/2 will be enabled for the metrics and webhook servers")
flag.StringVar(&watchNamespace, "namespace", "", "Namespace that the controller watches to reconcile api objects. If unspecified, the controller watches for api objects across all namespaces.")
flag.StringVar(&watchFilterValue, "watch-filter", "", fmt.Sprintf("Label value that the controller watches to reconcile api objects. Label key is always %q. If unspecified, the controller watches for all api objects.", v1alpha1.WatchLabel))
flag.StringVar(&providerName, "provider", "openconfig", "The provider to use for the controller. If not specified, the default provider is used. Available providers: "+strings.Join(provider.Providers(), ", "))
flag.DurationVar(&requeueInterval, "requeue-interval", time.Hour, "The interval after which Kubernetes resources should be reconciled again regardless of whether they have changed.")
flag.DurationVar(&heartbeatInterval, "heartbeat-interval", 30*time.Second, "The interval after which the controller retries a reachability check on each device.")
flag.IntVar(&tftpPort, "tftp-port", 1069, "The port on which the inline TFTP server listens. Set to 0 to disable the TFTP server.")
Expand Down Expand Up @@ -256,13 +253,6 @@ func main() { //nolint:gocyclo
os.Exit(1)
}

setupLog.Info("Using provider", "provider", providerName)
prov, err := provider.Get(providerName)
if err != nil {
setupLog.Error(err, "failed to get provider", "provider", providerName)
os.Exit(1)
}

ctx := ctrl.SetupSignalHandler()

if lockerNamespace == "" {
Expand Down Expand Up @@ -306,11 +296,11 @@ func main() { //nolint:gocyclo
}

if err := (&corecontroller.DeviceReconciler{
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
Recorder: mgr.GetEventRecorder("device-controller"),
WatchFilterValue: watchFilterValue,
Provider: prov,
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
Recorder: mgr.GetEventRecorder("device-controller"),
WatchFilterValue: watchFilterValue,
// Provider: prov,
HeartbeatInterval: heartbeatInterval,
}).SetupWithManager(mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "Device")
Expand All @@ -322,7 +312,6 @@ func main() { //nolint:gocyclo
Scheme: mgr.GetScheme(),
Recorder: mgr.GetEventRecorder("interface-controller"),
WatchFilterValue: watchFilterValue,
Provider: prov,
Locker: locker,
RequeueInterval: requeueInterval,
}).SetupWithManager(ctx, mgr); err != nil {
Expand All @@ -335,7 +324,6 @@ func main() { //nolint:gocyclo
Scheme: mgr.GetScheme(),
Recorder: mgr.GetEventRecorder("banner-controller"),
WatchFilterValue: watchFilterValue,
Provider: prov,
Locker: locker,
}).SetupWithManager(ctx, mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "Banner")
Expand All @@ -347,7 +335,6 @@ func main() { //nolint:gocyclo
Scheme: mgr.GetScheme(),
Recorder: mgr.GetEventRecorder("user-controller"),
WatchFilterValue: watchFilterValue,
Provider: prov,
Locker: locker,
}).SetupWithManager(ctx, mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "User")
Expand All @@ -359,7 +346,6 @@ func main() { //nolint:gocyclo
Scheme: mgr.GetScheme(),
Recorder: mgr.GetEventRecorder("dns-controller"),
WatchFilterValue: watchFilterValue,
Provider: prov,
Locker: locker,
}).SetupWithManager(ctx, mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "DNS")
Expand All @@ -371,7 +357,6 @@ func main() { //nolint:gocyclo
Scheme: mgr.GetScheme(),
Recorder: mgr.GetEventRecorder("ntp-controller"),
WatchFilterValue: watchFilterValue,
Provider: prov,
Locker: locker,
}).SetupWithManager(ctx, mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "NTP")
Expand All @@ -383,7 +368,6 @@ func main() { //nolint:gocyclo
Scheme: mgr.GetScheme(),
Recorder: mgr.GetEventRecorder("acl-controller"),
WatchFilterValue: watchFilterValue,
Provider: prov,
Locker: locker,
}).SetupWithManager(ctx, mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "AccessControlList")
Expand All @@ -395,7 +379,6 @@ func main() { //nolint:gocyclo
Scheme: mgr.GetScheme(),
Recorder: mgr.GetEventRecorder("certificate-controller"),
WatchFilterValue: watchFilterValue,
Provider: prov,
Locker: locker,
}).SetupWithManager(ctx, mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "Certificate")
Expand All @@ -407,7 +390,6 @@ func main() { //nolint:gocyclo
Scheme: mgr.GetScheme(),
Recorder: mgr.GetEventRecorder("snmp-controller"),
WatchFilterValue: watchFilterValue,
Provider: prov,
Locker: locker,
}).SetupWithManager(ctx, mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "SNMP")
Expand All @@ -419,7 +401,6 @@ func main() { //nolint:gocyclo
Scheme: mgr.GetScheme(),
Recorder: mgr.GetEventRecorder("syslog-controller"),
WatchFilterValue: watchFilterValue,
Provider: prov,
Locker: locker,
}).SetupWithManager(ctx, mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "Syslog")
Expand All @@ -431,7 +412,6 @@ func main() { //nolint:gocyclo
Scheme: mgr.GetScheme(),
Recorder: mgr.GetEventRecorder("managementaccess-controller"),
WatchFilterValue: watchFilterValue,
Provider: prov,
Locker: locker,
}).SetupWithManager(ctx, mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "ManagementAccess")
Expand All @@ -443,7 +423,6 @@ func main() { //nolint:gocyclo
Scheme: mgr.GetScheme(),
Recorder: mgr.GetEventRecorder("isis-controller"),
WatchFilterValue: watchFilterValue,
Provider: prov,
Locker: locker,
}).SetupWithManager(ctx, mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "ISIS")
Expand All @@ -455,7 +434,6 @@ func main() { //nolint:gocyclo
Scheme: mgr.GetScheme(),
Recorder: mgr.GetEventRecorder("pim-controller"),
WatchFilterValue: watchFilterValue,
Provider: prov,
Locker: locker,
}).SetupWithManager(ctx, mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "PIM")
Expand All @@ -467,7 +445,6 @@ func main() { //nolint:gocyclo
Scheme: mgr.GetScheme(),
Recorder: mgr.GetEventRecorder("bgp-controller"),
WatchFilterValue: watchFilterValue,
Provider: prov,
Locker: locker,
RequeueInterval: requeueInterval,
}).SetupWithManager(ctx, mgr); err != nil {
Expand All @@ -480,7 +457,6 @@ func main() { //nolint:gocyclo
Scheme: mgr.GetScheme(),
Recorder: mgr.GetEventRecorder("bgppeer-controller"),
WatchFilterValue: watchFilterValue,
Provider: prov,
Locker: locker,
RequeueInterval: requeueInterval,
}).SetupWithManager(ctx, mgr); err != nil {
Expand All @@ -493,7 +469,6 @@ func main() { //nolint:gocyclo
Scheme: mgr.GetScheme(),
Recorder: mgr.GetEventRecorder("lldp-controller"),
WatchFilterValue: watchFilterValue,
Provider: prov,
Locker: locker,
RequeueInterval: requeueInterval,
}).SetupWithManager(ctx, mgr); err != nil {
Expand All @@ -506,7 +481,6 @@ func main() { //nolint:gocyclo
Scheme: mgr.GetScheme(),
Recorder: mgr.GetEventRecorder("ospf-controller"),
WatchFilterValue: watchFilterValue,
Provider: prov,
Locker: locker,
RequeueInterval: requeueInterval,
}).SetupWithManager(ctx, mgr); err != nil {
Expand All @@ -519,7 +493,6 @@ func main() { //nolint:gocyclo
Scheme: mgr.GetScheme(),
Recorder: mgr.GetEventRecorder("vlan-controller"),
WatchFilterValue: watchFilterValue,
Provider: prov,
Locker: locker,
RequeueInterval: requeueInterval,
}).SetupWithManager(ctx, mgr); err != nil {
Expand All @@ -532,7 +505,6 @@ func main() { //nolint:gocyclo
Scheme: mgr.GetScheme(),
Recorder: mgr.GetEventRecorder("vrf-controller"),
WatchFilterValue: watchFilterValue,
Provider: prov,
Locker: locker,
}).SetupWithManager(ctx, mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "VRF")
Expand All @@ -544,7 +516,6 @@ func main() { //nolint:gocyclo
Scheme: mgr.GetScheme(),
Recorder: mgr.GetEventRecorder("cisco-nx-vpcdomain-controller"),
WatchFilterValue: watchFilterValue,
Provider: prov,
Locker: locker,
RequeueInterval: requeueInterval,
}).SetupWithManager(ctx, mgr); err != nil {
Expand All @@ -557,7 +528,6 @@ func main() { //nolint:gocyclo
Scheme: mgr.GetScheme(),
Recorder: mgr.GetEventRecorder("nve-controller"),
WatchFilterValue: watchFilterValue,
Provider: prov,
Locker: locker,
RequeueInterval: requeueInterval,
}).SetupWithManager(ctx, mgr); err != nil {
Expand All @@ -570,7 +540,6 @@ func main() { //nolint:gocyclo
Scheme: mgr.GetScheme(),
Recorder: mgr.GetEventRecorder("cisco-nx-system-controller"),
WatchFilterValue: watchFilterValue,
Provider: prov,
Locker: locker,
}).SetupWithManager(ctx, mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "System")
Expand All @@ -582,7 +551,6 @@ func main() { //nolint:gocyclo
Scheme: mgr.GetScheme(),
Recorder: mgr.GetEventRecorder("evpn-instance-controller"),
WatchFilterValue: watchFilterValue,
Provider: prov,
Locker: locker,
}).SetupWithManager(ctx, mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "EVPNInstance")
Expand All @@ -594,7 +562,6 @@ func main() { //nolint:gocyclo
Scheme: mgr.GetScheme(),
Recorder: mgr.GetEventRecorder("aaa-controller"),
WatchFilterValue: watchFilterValue,
Provider: prov,
Locker: locker,
}).SetupWithManager(mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "AAA")
Expand All @@ -606,7 +573,6 @@ func main() { //nolint:gocyclo
Scheme: mgr.GetScheme(),
Recorder: mgr.GetEventRecorder("prefixset-controller"),
WatchFilterValue: watchFilterValue,
Provider: prov,
Locker: locker,
}).SetupWithManager(ctx, mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "PrefixSet")
Expand All @@ -618,7 +584,6 @@ func main() { //nolint:gocyclo
Scheme: mgr.GetScheme(),
Recorder: mgr.GetEventRecorder("routingpolicy-controller"),
WatchFilterValue: watchFilterValue,
Provider: prov,
Locker: locker,
}).SetupWithManager(ctx, mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "RoutingPolicy")
Expand All @@ -630,7 +595,6 @@ func main() { //nolint:gocyclo
Scheme: mgr.GetScheme(),
Recorder: mgr.GetEventRecorder("cisco-nx-border-gateway-controller"),
WatchFilterValue: watchFilterValue,
Provider: prov,
Locker: locker,
}).SetupWithManager(ctx, mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "BorderGateway")
Expand All @@ -642,7 +606,6 @@ func main() { //nolint:gocyclo
Scheme: mgr.GetScheme(),
Recorder: mgr.GetEventRecorder("dhcprelay-controller"),
WatchFilterValue: watchFilterValue,
Provider: prov,
Locker: locker,
RequeueInterval: requeueInterval,
}).SetupWithManager(ctx, mgr); err != nil {
Expand All @@ -655,7 +618,6 @@ func main() { //nolint:gocyclo
Scheme: mgr.GetScheme(),
Recorder: mgr.GetEventRecorder("ethernetsegment-controller"),
WatchFilterValue: watchFilterValue,
Provider: prov,
Locker: locker,
RequeueInterval: requeueInterval,
}).SetupWithManager(ctx, mgr); err != nil {
Expand Down Expand Up @@ -779,14 +741,12 @@ func main() { //nolint:gocyclo
// is implemented and the port is set to a non-zero value.
// The server is added to the manager so it starts after the cache is synced
// and shuts down gracefully when the manager stops.
provisioningProvider, ok := prov().(provider.ProvisioningProvider)
if provisioningHTTPPort != 0 && ok {
if provisioningHTTPPort != 0 {
provisioningServer := &provisioning.HTTPServer{
Client: mgr.GetClient(),
Logger: ctrl.Log.WithName("provisioning"),
Recorder: mgr.GetEventRecorder("provisioning"),
ValidateSourceIP: provisioningHTTPValidateSourceIP,
Provider: provisioningProvider,
Port: provisioningHTTPPort,
}
setupLog.Info("Adding provisioning HTTP server to manager", "port", provisioningHTTPPort, "validateSourceIP", provisioningHTTPValidateSourceIP)
Expand Down
6 changes: 6 additions & 0 deletions config/crd/bases/networking.metal.ironcore.dev_devices.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion config/develop/manager_patch.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
value:
- --leader-elect=false
- --health-probe-bind-address=:8081
- --provider=openconfig
- --requeue-interval=30s
- --max-concurrent-reconciles=5
- --zap-log-level=3
1 change: 1 addition & 0 deletions docs/api-reference/index.md

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading