Skip to content

Commit 469ac08

Browse files
authored
Release 3.0.0 (#78)
* fix: added empty tags array in subnetmeta * feat: bgp added untagged * feat: bgp update BGPTransport name regexp pattern * feat: update go version * feat: added 'untagged' option in vnet interface * nat: changed DnatToPort type * update readme * update chart.yaml * update README.md
1 parent abe360f commit 469ac08

26 files changed

+176
-69
lines changed

Dockerfile

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# syntax=docker/dockerfile:experimental
22
# Build the manager binary
3-
FROM golang:1.17 as builder
3+
FROM golang:1.18 as builder
44

55
WORKDIR /workspace
66

README.md

+2-8
Original file line numberDiff line numberDiff line change
@@ -34,16 +34,10 @@ Netris Operator managing resources samples are available in the `samples/` [fold
3434
| `v0.X` | `v2.9` |
3535
| `v1.X` | `v3.0` |
3636
| `v2.X` | `v3.1+` |
37+
| `v3.X` | `v4.1+` |
3738

3839

3940
## Features
4041
* Managing Netris Controller via CRD
4142
* Automatically creating `L4LB` resource for `type: load-balancer` services
42-
* Integration with CNI:
43-
| | |
44-
| -----------| ---------------------|
45-
| `Calico` | `Ready` |
46-
| `Cilium` | *`In progress`* |
47-
| `Flannel` | *`In progress`* |
48-
49-
43+
* All CNIs are welcome

api/v1alpha1/bgp_types.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ type BGPMultihop struct {
8989
type BGPTransport struct {
9090
// +kubebuilder:validation:Enum=port;vnet
9191
Type string `json:"type,omitempty"`
92-
// +kubebuilder:validation:Pattern=`(^[a-zA-Z0-9]+@[a-zA-Z0-9-]+$)|(^[a-zA-Z0-9]([-a-zA-Z0-9]*[a-z0-9])?(\.[a-zA-Z0-9]([-a-zA-Z0-9]*[a-zA-Z0-9])?)*$)`
92+
// +kubebuilder:validation:Pattern=`(^[a-zA-Z0-9]+@[a-zA-Z0-9-]+$)|(^[a-zA-Z0-9]([-a-zA-Z0-9]*[a-zA-Z0-9])?(\.[a-zA-Z0-9]([-a-zA-Z0-9]*[a-zA-Z0-9])?)*$)`
9393
Name string `json:"name"`
9494
VlanID int `json:"vlanId,omitempty"`
9595
}

api/v1alpha1/nat_types.go

+2-4
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,7 @@ type NatSpec struct {
5959
// +kubebuilder:validation:Pattern=`(^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\/([0-9]|[12]\d|3[0-2]))?$)|(^((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?(\/([1-9]|[1-5][0-9]|6[0-4]))?$)`
6060
DnatToIP string `json:"dnatToIp,omitempty"`
6161

62-
// +kubebuilder:validation:Minimum=1
63-
// +kubebuilder:validation:Maximum=65535
64-
DnatToPort int `json:"dnatToPort,omitempty"`
62+
DnatToPort string `json:"dnatToPort,omitempty"`
6563
}
6664

6765
// NatStatus defines the observed state of Nat
@@ -85,7 +83,7 @@ type NatStatus struct {
8583
// +kubebuilder:printcolumn:name="SNATToIP",type=string,JSONPath=`.spec.snatToIp`,priority=1
8684
// +kubebuilder:printcolumn:name="SNATToPool",type=string,JSONPath=`.spec.snatToPool`,priority=1
8785
// +kubebuilder:printcolumn:name="DNATToIP",type=string,JSONPath=`.spec.dnatToIp`,priority=1
88-
// +kubebuilder:printcolumn:name="DNATToPort",type=integer,JSONPath=`.spec.dnatToPort`,priority=1
86+
// +kubebuilder:printcolumn:name="DNATToPort",type=string,JSONPath=`.spec.dnatToPort`,priority=1
8987
// +kubebuilder:printcolumn:name="Status",type=string,JSONPath=`.status.status`
9088
// +kubebuilder:printcolumn:name="Age",type=date,JSONPath=`.metadata.creationTimestamp`
9189

api/v1alpha1/natmeta_types.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ type NatMetaSpec struct {
4545
SnatToIP string `json:"snatToIp,omitempty"`
4646
SnatToPool string `json:"snatToPool,omitempty"`
4747
DnatToIP string `json:"dnatToIp,omitempty"`
48-
DnatToPort int `json:"dnatToPort,omitempty"`
48+
DnatToPort string `json:"dnatToPort,omitempty"`
4949
}
5050

5151
// NatMetaStatus defines the observed state of NatMeta

api/v1alpha1/vnet_types.go

+2
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,8 @@ type VNetSwitchPort struct {
118118
// +kubebuilder:validation:Maximum=4094
119119
VlanID int `json:"vlanId,omitempty"`
120120
State string `json:"state,omitempty"`
121+
// +kubebuilder:validation:Enum=yes;no
122+
Untagged string `json:"untagged,omitempty"`
121123
}
122124

123125
func init() {

api/v1alpha1/vnetmeta_types.go

+7-6
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,13 @@ type VNetMetaSite struct {
5252

5353
// VNetMetaMember .
5454
type VNetMetaMember struct {
55-
Name string `json:"name"`
56-
Access bool `json:"access"`
57-
ID int `json:"id"`
58-
Lacp string `json:"lacp"`
59-
State string `json:"state"`
60-
Vlan string `json:"vlan"`
55+
Name string `json:"name"`
56+
Access bool `json:"access"`
57+
ID int `json:"id"`
58+
Lacp string `json:"lacp"`
59+
State string `json:"state"`
60+
Vlan string `json:"vlan"`
61+
Untagged string `json:"untagged,omitempty"`
6162
}
6263

6364
// VNetMetaGateway .

config/crd/bases/k8s.netris.ai_bgps.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ spec:
139139
description: BGPTransport .
140140
properties:
141141
name:
142-
pattern: (^[a-zA-Z0-9]+@[a-zA-Z0-9-]+$)|(^[a-zA-Z0-9]([-a-zA-Z0-9]*[a-z0-9])?(\.[a-zA-Z0-9]([-a-zA-Z0-9]*[a-zA-Z0-9])?)*$)
142+
pattern: (^[a-zA-Z0-9]+@[a-zA-Z0-9-]+$)|(^[a-zA-Z0-9]([-a-zA-Z0-9]*[a-zA-Z0-9])?(\.[a-zA-Z0-9]([-a-zA-Z0-9]*[a-zA-Z0-9])?)*$)
143143
type: string
144144
type:
145145
enum:

config/crd/bases/k8s.netris.ai_natmeta.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ spec:
4343
dnatToIp:
4444
type: string
4545
dnatToPort:
46-
type: integer
46+
type: string
4747
dstAddress:
4848
type: string
4949
dstPort:

config/crd/bases/k8s.netris.ai_nats.yaml

+2-4
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ spec:
5656
- jsonPath: .spec.dnatToPort
5757
name: DNATToPort
5858
priority: 1
59-
type: integer
59+
type: string
6060
- jsonPath: .status.status
6161
name: Status
6262
type: string
@@ -96,9 +96,7 @@ spec:
9696
pattern: (^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\/([0-9]|[12]\d|3[0-2]))?$)|(^((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?(\/([1-9]|[1-5][0-9]|6[0-4]))?$)
9797
type: string
9898
dnatToPort:
99-
maximum: 65535
100-
minimum: 1
101-
type: integer
99+
type: string
102100
dstAddress:
103101
pattern: (^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\/([0-9]|[12]\d|3[0-2]))?$)|(^((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?(\/([1-9]|[1-5][0-9]|6[0-4]))?$)
104102
type: string

config/crd/bases/k8s.netris.ai_vnetmeta.yaml

+2
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ spec:
8383
type: string
8484
state:
8585
type: string
86+
untagged:
87+
type: string
8688
vlan:
8789
type: string
8890
required:

config/crd/bases/k8s.netris.ai_vnets.yaml

+5
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,11 @@ spec:
108108
type: string
109109
state:
110110
type: string
111+
untagged:
112+
enum:
113+
- "yes"
114+
- "no"
115+
type: string
111116
vlanId:
112117
maximum: 4094
113118
minimum: 2

controllers/api_handler.go

+19-11
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import (
2424
k8sv1alpha1 "github.com/netrisai/netris-operator/api/v1alpha1"
2525
"github.com/netrisai/netris-operator/configloader"
2626
"github.com/netrisai/netris-operator/netrisstorage"
27-
"github.com/netrisai/netriswebapi/v2/types/vnet"
2827
)
2928

3029
func init() {
@@ -36,7 +35,7 @@ func init() {
3635

3736
func (r *VNetReconciler) getPortsMeta(portNames []k8sv1alpha1.VNetSwitchPort) ([]k8sv1alpha1.VNetMetaMember, error) {
3837
members := []k8sv1alpha1.VNetMetaMember{}
39-
hwPorts := make(map[string]*vnet.VNetAddPort)
38+
hwPorts := make(map[string]*k8sv1alpha1.VNetMetaMember)
4039
for _, port := range portNames {
4140
vlanID := "1"
4241
if port.VlanID > 1 {
@@ -50,10 +49,18 @@ func (r *VNetReconciler) getPortsMeta(portNames []k8sv1alpha1.VNetSwitchPort) ([
5049
}
5150
}
5251

53-
hwPorts[port.Name] = &vnet.VNetAddPort{
54-
Vlan: vlanID,
55-
Lacp: "off",
56-
State: state,
52+
untagged := ""
53+
if len(port.Untagged) > 0 {
54+
if port.Untagged == "yes" || port.Untagged == "no" {
55+
untagged = port.Untagged
56+
}
57+
}
58+
59+
hwPorts[port.Name] = &k8sv1alpha1.VNetMetaMember{
60+
Vlan: vlanID,
61+
Lacp: "off",
62+
State: state,
63+
Untagged: untagged,
5764
}
5865

5966
}
@@ -69,11 +76,12 @@ func (r *VNetReconciler) getPortsMeta(portNames []k8sv1alpha1.VNetSwitchPort) ([
6976

7077
for _, member := range hwPorts {
7178
members = append(members, k8sv1alpha1.VNetMetaMember{
72-
Name: member.Name,
73-
Lacp: member.Lacp,
74-
State: member.State,
75-
ID: member.ID,
76-
Vlan: member.Vlan,
79+
Name: member.Name,
80+
Lacp: member.Lacp,
81+
State: member.State,
82+
ID: member.ID,
83+
Vlan: member.Vlan,
84+
Untagged: member.Untagged,
7785
})
7886
}
7987
return members, nil

controllers/bgp_translations.go

+11-3
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ func (r *BGPReconciler) BGPToBGPMeta(bgp *k8sv1alpha1.BGP) (*k8sv1alpha1.BGPMeta
6666
} else if bgp.Spec.Transport.Name != "" {
6767
return nil, fmt.Errorf("coundn't find port %s", bgp.Spec.Transport.Name)
6868
}
69-
vlanID = 1
69+
vlanID = -1
7070
} else {
7171
vnets, err := r.Cred.VNet().Get()
7272
if err != nil {
@@ -214,6 +214,11 @@ func BGPMetaToNetris(bgpMeta *k8sv1alpha1.BGPMeta) (*bgp.EBGPAdd, error) {
214214
hwID = "auto"
215215
}
216216

217+
var untagged bool = false
218+
if bgpMeta.Spec.Vlan == -1 {
219+
untagged = true
220+
}
221+
217222
bgpAdd := &bgp.EBGPAdd{
218223
AllowAsIn: bgpMeta.Spec.AllowasIn,
219224
BgpPassword: bgpMeta.Spec.BgpPassword,
@@ -245,6 +250,7 @@ func BGPMetaToNetris(bgpMeta *k8sv1alpha1.BGPMeta) (*bgp.EBGPAdd, error) {
245250
Vlan: bgpMeta.Spec.Vlan,
246251
Weight: bgpMeta.Spec.Weight,
247252
Tags: []string{},
253+
Untagged: untagged,
248254
}
249255

250256
return bgpAdd, nil
@@ -418,8 +424,10 @@ func compareBGPMetaAPIEBGP(bgpMeta *k8sv1alpha1.BGPMeta, apiBGP *bgp.EBGP, u uni
418424
return false
419425
}
420426
if apiBGP.Vlan != bgpMeta.Spec.Vlan {
421-
u.DebugLogger.Info("Vlan changed", "netrisValue", apiBGP.Vlan, "k8sValue", bgpMeta.Spec.Vlan)
422-
return false
427+
if bgpMeta.Spec.Vlan != -1 {
428+
u.DebugLogger.Info("Vlan changed", "netrisValue", apiBGP.Vlan, "k8sValue", bgpMeta.Spec.Vlan)
429+
return false
430+
}
423431
}
424432
if apiBGP.Weight != bgpMeta.Spec.Weight {
425433
u.DebugLogger.Info("Weight changed", "netrisValue", apiBGP.Weight, "k8sValue", bgpMeta.Spec.Weight)

controllers/nat_translations.go

+2-3
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ package controllers
1818

1919
import (
2020
"fmt"
21-
"strconv"
2221
"strings"
2322

2423
k8sv1alpha1 "github.com/netrisai/netris-operator/api/v1alpha1"
@@ -135,7 +134,7 @@ func NatMetaToNetris(natMeta *k8sv1alpha1.NatMeta) (*nat.NATw, error) {
135134
SnatToIP: natMeta.Spec.SnatToIP,
136135
SnatToPool: natMeta.Spec.SnatToPool,
137136
DnatToIP: natMeta.Spec.DnatToIP,
138-
DnatToPort: strconv.Itoa(natMeta.Spec.DnatToPort),
137+
DnatToPort: natMeta.Spec.DnatToPort,
139138
}
140139

141140
return natAdd, nil
@@ -157,7 +156,7 @@ func NatMetaToNetrisUpdate(natMeta *k8sv1alpha1.NatMeta) (*nat.NATw, error) {
157156
SnatToIP: natMeta.Spec.SnatToIP,
158157
SnatToPool: natMeta.Spec.SnatToPool,
159158
DnatToIP: natMeta.Spec.DnatToIP,
160-
DnatToPort: strconv.Itoa(natMeta.Spec.DnatToPort),
159+
DnatToPort: natMeta.Spec.DnatToPort,
161160
}
162161

163162
return natAdd, nil

controllers/subnet_translations.go

+1
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ func SubnetMetaToNetris(subnetMeta *k8sv1alpha1.SubnetMeta) (*ipam.Subnet, error
127127
Purpose: subnetMeta.Spec.Purpose,
128128
DefaultGateway: subnetMeta.Spec.DefaultGateway,
129129
Sites: sites,
130+
Tags: []string{},
130131
}
131132

132133
return subnetAdd, nil

0 commit comments

Comments
 (0)