Skip to content

Commit

Permalink
Add partition wise network peering status in apinetlet
Browse files Browse the repository at this point in the history
  • Loading branch information
kasabe28 committed Oct 1, 2024
1 parent b0b74d6 commit da8fdf1
Show file tree
Hide file tree
Showing 15 changed files with 101 additions and 77 deletions.
2 changes: 1 addition & 1 deletion api/core/v1alpha1/network_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ type PeeringPrefix struct {

type NetworkStatus struct {
// Peerings contains the states of the network peerings for the network.
Peerings []NetworkPeeringStatus `json:"peerings,omitempty"`
Peerings map[string][]NetworkPeeringStatus `json:"peerings,omitempty"`
}

// NetworkState is the state of a network.
Expand Down
14 changes: 12 additions & 2 deletions api/core/v1alpha1/zz_generated.deepcopy.go

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

41 changes: 23 additions & 18 deletions apinetlet/controllers/conversion.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,27 +80,32 @@ func apiNetNetworkInterfaceStateToNetworkInterfaceState(state apinetv1alpha1.Net
}
}

func apiNetNetworkPeeringsStatusToNetworkPeeringsStatus(peerings []apinetv1alpha1.NetworkPeeringStatus, specPeerings []apinetv1alpha1.NetworkPeering) []networkingv1alpha1.NetworkPeeringStatus {
func apiNetNetworkPeeringsStatusToNetworkPeeringsStatus(partitionPeeringsMap map[string][]apinetv1alpha1.NetworkPeeringStatus, specPeerings []apinetv1alpha1.NetworkPeering) []networkingv1alpha1.NetworkPeeringStatus {
var networkPeeringsStatus []networkingv1alpha1.NetworkPeeringStatus
for _, peering := range peerings {
idx := slices.IndexFunc(specPeerings, func(specPeering apinetv1alpha1.NetworkPeering) bool {
return specPeering.ID == strconv.Itoa(int(peering.ID))
})
if idx != -1 {
var prefixStatus []networkingv1alpha1.PeeringPrefixStatus
if peering.State == apinetv1alpha1.NetworkPeeringStateReady {
for _, peeringPrefix := range specPeerings[idx].Prefixes {
prefixStatus = append(prefixStatus, networkingv1alpha1.PeeringPrefixStatus{
Name: peeringPrefix.Name,
Prefix: (*commonv1alpha1.IPPrefix)(peeringPrefix.Prefix),
})
for _, peerings := range partitionPeeringsMap {
if len(peerings) == 0 {
continue
}
for _, peering := range peerings {
idx := slices.IndexFunc(specPeerings, func(specPeering apinetv1alpha1.NetworkPeering) bool {
return specPeering.ID == strconv.Itoa(int(peering.ID))
})
if idx != -1 {
var prefixStatus []networkingv1alpha1.PeeringPrefixStatus
if peering.State == apinetv1alpha1.NetworkPeeringStateReady {
for _, peeringPrefix := range specPeerings[idx].Prefixes {
prefixStatus = append(prefixStatus, networkingv1alpha1.PeeringPrefixStatus{
Name: peeringPrefix.Name,
Prefix: (*commonv1alpha1.IPPrefix)(peeringPrefix.Prefix),
})
}
}
networkPeeringsStatus = append(networkPeeringsStatus, networkingv1alpha1.NetworkPeeringStatus{
Name: specPeerings[idx].Name,
State: networkingv1alpha1.NetworkPeeringState(peering.State),
Prefixes: prefixStatus,
})
}
networkPeeringsStatus = append(networkPeeringsStatus, networkingv1alpha1.NetworkPeeringStatus{
Name: specPeerings[idx].Name,
State: networkingv1alpha1.NetworkPeeringState(peering.State),
Prefixes: prefixStatus,
})
}
}
return networkPeeringsStatus
Expand Down
3 changes: 0 additions & 3 deletions apinetlet/controllers/network_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -248,10 +248,7 @@ func (r *NetworkReconciler) applyAPINetNetwork(ctx context.Context, log logr.Log
})
}
}
// apiNetNetwork.Spec.Peerings = peerings

log.V(1).Info("APINet network spec peerings", "old", apiNetNetwork.Spec.Peerings, "new", peerings)
log.V(1).Info("APINet network status", "old", apiNetNetwork.Status.Peerings)
isPeeringsEqual := equality.Semantic.DeepEqual(apiNetNetwork.Spec.Peerings, peerings)

if !isNetworkExist || !isPeeringsEqual {
Expand Down
8 changes: 4 additions & 4 deletions apinetlet/controllers/network_controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -201,15 +201,15 @@ var _ = Describe("NetworkController", func() {
By("patching apinet network peering status")
apiNetNetwork2ID, _ := strconv.Atoi(apiNetNetwork2.Spec.ID)
Eventually(UpdateStatus(apiNetNetwork1, func() {
apiNetNetwork1.Status.Peerings = []apinetv1alpha1.NetworkPeeringStatus{{
apiNetNetwork1.Status.Peerings["partition1"] = []apinetv1alpha1.NetworkPeeringStatus{{
ID: int32(apiNetNetwork2ID),
State: apinetv1alpha1.NetworkPeeringStateReady,
}}
})).Should(Succeed())

apiNetNetwork1ID, _ := strconv.Atoi(apiNetNetwork1.Spec.ID)
Eventually(UpdateStatus(apiNetNetwork2, func() {
apiNetNetwork2.Status.Peerings = []apinetv1alpha1.NetworkPeeringStatus{{
apiNetNetwork2.Status.Peerings["partition1"] = []apinetv1alpha1.NetworkPeeringStatus{{
ID: int32(apiNetNetwork1ID),
State: apinetv1alpha1.NetworkPeeringStateReady,
}}
Expand Down Expand Up @@ -377,15 +377,15 @@ var _ = Describe("NetworkController", func() {
By("patching apinet network peering status")
apiNetNetwork2ID, _ := strconv.Atoi(apiNetNetwork2.Spec.ID)
Eventually(UpdateStatus(apiNetNetwork1, func() {
apiNetNetwork1.Status.Peerings = []apinetv1alpha1.NetworkPeeringStatus{{
apiNetNetwork1.Status.Peerings["partition1"] = []apinetv1alpha1.NetworkPeeringStatus{{
ID: int32(apiNetNetwork2ID),
State: apinetv1alpha1.NetworkPeeringStateReady,
}}
})).Should(Succeed())

apiNetNetwork1ID, _ := strconv.Atoi(apiNetNetwork1.Spec.ID)
Eventually(UpdateStatus(apiNetNetwork2, func() {
apiNetNetwork2.Status.Peerings = []apinetv1alpha1.NetworkPeeringStatus{{
apiNetNetwork2.Status.Peerings["partition1"] = []apinetv1alpha1.NetworkPeeringStatus{{
ID: int32(apiNetNetwork1ID),
State: apinetv1alpha1.NetworkPeeringStateReady,
}}
Expand Down
23 changes: 14 additions & 9 deletions client-go/applyconfigurations/core/v1alpha1/networkstatus.go

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

8 changes: 5 additions & 3 deletions client-go/applyconfigurations/internal/internal.go

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

1 change: 0 additions & 1 deletion client-go/openapi/api_violations.report
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ API rule violation: list_type_missing,github.com/ironcore-dev/ironcore-net/api/c
API rule violation: list_type_missing,github.com/ironcore-dev/ironcore-net/api/core/v1alpha1,NetworkPolicySpec,Ingress
API rule violation: list_type_missing,github.com/ironcore-dev/ironcore-net/api/core/v1alpha1,NetworkPolicySpec,PolicyTypes
API rule violation: list_type_missing,github.com/ironcore-dev/ironcore-net/api/core/v1alpha1,NetworkSpec,Peerings
API rule violation: list_type_missing,github.com/ironcore-dev/ironcore-net/api/core/v1alpha1,NetworkStatus,Peerings
API rule violation: list_type_missing,github.com/ironcore-dev/ironcore-net/api/core/v1alpha1,NodeSelector,NodeSelectorTerms
API rule violation: list_type_missing,github.com/ironcore-dev/ironcore-net/api/core/v1alpha1,NodeSelectorRequirement,Values
API rule violation: list_type_missing,github.com/ironcore-dev/ironcore-net/api/core/v1alpha1,NodeSelectorTerm,MatchExpressions
Expand Down
16 changes: 12 additions & 4 deletions client-go/openapi/zz_generated.openapi.go

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

11 changes: 4 additions & 7 deletions docs/api-reference/core.md
Original file line number Diff line number Diff line change
Expand Up @@ -1556,7 +1556,7 @@ LocalUIDReference
</em>
</td>
<td>
<p>NetworkRef is the network the load balancer is assigned to.</p>
<p>NetworkRef is the network to which network policy is applied.</p>
</td>
</tr>
<tr>
Expand Down Expand Up @@ -3800,9 +3800,6 @@ to the peered network, if no prefixes are specified no filtering will be done.</
</table>
<h3 id="core.apinet.ironcore.dev/v1alpha1.NetworkPeeringStatus">NetworkPeeringStatus
</h3>
<p>
(<em>Appears on:</em><a href="#core.apinet.ironcore.dev/v1alpha1.NetworkStatus">NetworkStatus</a>)
</p>
<div>
<p>NetworkPeeringStatus is the status of a network peering.</p>
</div>
Expand Down Expand Up @@ -4201,8 +4198,8 @@ string
<td>
<code>peerings</code><br/>
<em>
<a href="#core.apinet.ironcore.dev/v1alpha1.NetworkPeeringStatus">
[]NetworkPeeringStatus
<a href="#core.apinet.ironcore.dev/v1alpha1.[]ironcore-net/api/core/v1alpha1.NetworkPeeringStatus">
map[string][]ironcore-net/api/core/v1alpha1.NetworkPeeringStatus
</a>
</em>
</td>
Expand Down Expand Up @@ -4570,7 +4567,7 @@ string
(<em>Appears on:</em><a href="#core.apinet.ironcore.dev/v1alpha1.NetworkPeering">NetworkPeering</a>)
</p>
<div>
<p>PeeringPrefixes defines prefixes to be exposed to the peered network</p>
<p>PeeringPrefix defines prefixes to be exposed to the peered network</p>
</div>
<table>
<thead>
Expand Down
2 changes: 1 addition & 1 deletion internal/apis/core/network_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ type PeeringPrefix struct {
}
type NetworkStatus struct {
// Peerings contains the states of the network peerings for the network.
Peerings []NetworkPeeringStatus
Peerings map[string][]NetworkPeeringStatus
}

// NetworkState is the state of a network.
Expand Down
4 changes: 2 additions & 2 deletions internal/apis/core/v1alpha1/zz_generated.conversion.go

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

14 changes: 12 additions & 2 deletions internal/apis/core/zz_generated.deepcopy.go

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

23 changes: 7 additions & 16 deletions metalnetlet/controllers/network_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -114,12 +114,14 @@ func (r *NetworkReconciler) delete(ctx context.Context, log logr.Logger, network
}

func (r *NetworkReconciler) updateApinetNetworkStatus(ctx context.Context, log logr.Logger, network *apinetv1alpha1.Network, metalnetNetwork *metalnetv1alpha1.Network) error {
newStatusPeerings := metalnetNetworkPeeringsStatusToNetworkPeeringsStatus(metalnetNetwork.Status.Peerings)
log.V(1).Info("apinet status", "old", network.Status.Peerings, "new", newStatusPeerings)
if !equality.Semantic.DeepEqual(network.Status.Peerings, newStatusPeerings) {
log.V(1).Info("Patching apinet network status", "status", newStatusPeerings)
apinetStatusPeerings := metalnetNetworkPeeringsStatusToNetworkPeeringsStatus(metalnetNetwork.Status.Peerings)
if !equality.Semantic.DeepEqual(network.Status.Peerings[r.PartitionName], apinetStatusPeerings) {
log.V(1).Info("Patching apinet network status", "status", apinetStatusPeerings)
networkBase := network.DeepCopy()
network.Status.Peerings = newStatusPeerings
if network.Status.Peerings == nil {
network.Status.Peerings = make(map[string][]apinetv1alpha1.NetworkPeeringStatus, 0)
}
network.Status.Peerings[r.PartitionName] = apinetStatusPeerings
if err := r.Status().Patch(ctx, network, client.MergeFrom(networkBase)); err != nil {
return fmt.Errorf("unable to patch network: %w", err)
}
Expand Down Expand Up @@ -219,7 +221,6 @@ func (r *NetworkReconciler) reconcile(ctx context.Context, log logr.Logger, netw
}

log.V(1).Info("Updating apinet network status")
log.V(1).Info("network status", "apinet", network.Status, "metalnet", metalnetNetwork.Status)
if err := r.updateApinetNetworkStatus(ctx, log, network, metalnetNetwork); err != nil {
return ctrl.Result{}, fmt.Errorf("error updating apinet networkstatus: %w", err)
}
Expand Down Expand Up @@ -251,13 +252,3 @@ func (r *NetworkReconciler) SetupWithManager(mgr ctrl.Manager, metalnetCache cac
).
Complete(r)
}

// func (r *NetworkReconciler) networkStatusChangedPredicate() predicate.Predicate {
// return predicate.Funcs{
// UpdateFunc: func(evt event.UpdateEvent) bool {
// oldNetwork := evt.ObjectOld.(*apinetv1alpha1.Network)
// newNetwork := evt.ObjectNew.(*apinetv1alpha1.Network)
// return !slices.Equal(oldNetwork.Status.Peerings, newNetwork.Status.Peerings)
// },
// }
// }
8 changes: 4 additions & 4 deletions metalnetlet/controllers/network_controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -114,17 +114,17 @@ var _ = Describe("NetworkController", func() {

By("ensuring apinet network status peerings are also updated")
Eventually(Object(network1)).Should(SatisfyAll(
HaveField("Status.Peerings", []apinetv1alpha1.NetworkPeeringStatus{{
HaveField("Status.Peerings", HaveKeyWithValue(partitionName, []apinetv1alpha1.NetworkPeeringStatus{{
ID: network2Vni,
State: apinetv1alpha1.NetworkPeeringStateReady,
}}),
}})),
))

Eventually(Object(network2)).Should(SatisfyAll(
HaveField("Status.Peerings", []apinetv1alpha1.NetworkPeeringStatus{{
HaveField("Status.Peerings", HaveKeyWithValue(partitionName, []apinetv1alpha1.NetworkPeeringStatus{{
ID: network1Vni,
State: apinetv1alpha1.NetworkPeeringStateReady,
}}),
}})),
))

By("deleting the networks")
Expand Down

0 comments on commit da8fdf1

Please sign in to comment.