From 101c7e2c66f986a522d5c4dd875f2e359b9bfcf6 Mon Sep 17 00:00:00 2001 From: Ashish Jain Date: Thu, 13 Jun 2024 23:08:21 +0530 Subject: [PATCH 01/11] O1-Telnet Support with Overrding Values --- .../controller/randeployment_controller.go | 2 +- internal/controller/resources_cucp.go | 11 +- internal/controller/resources_cuup.go | 19 +- internal/controller/resources_du.go | 47 +- internal/controller/templates.go | 51 +- internal/controller/templates_o1telnet.go | 458 ++++++++++++++++++ 6 files changed, 555 insertions(+), 33 deletions(-) create mode 100644 internal/controller/templates_o1telnet.go diff --git a/internal/controller/randeployment_controller.go b/internal/controller/randeployment_controller.go index 6b7728f..90a015e 100644 --- a/internal/controller/randeployment_controller.go +++ b/internal/controller/randeployment_controller.go @@ -238,7 +238,7 @@ func (r *RANDeploymentReconciler) GetConfigs(ctx context.Context, ranDeployment func (r *RANDeploymentReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { logger := log.FromContext(ctx).WithValues("RANDeployment", req.NamespacedName) - logger.Info("Reconcile for RANDeployment") + logger.Info("Local :: Du-Config-Done Reconcile for RANDeployment") instance := &workloadv1alpha1.NFDeployment{} err := r.Get(ctx, req.NamespacedName, instance) if err != nil { diff --git a/internal/controller/resources_cucp.go b/internal/controller/resources_cucp.go index f20313e..04c02a9 100644 --- a/internal/controller/resources_cucp.go +++ b/internal/controller/resources_cucp.go @@ -123,7 +123,7 @@ func (resource CuCpResources) GetConfigMap(log logr.Logger, ranDeployment *workl configMap1 := &corev1.ConfigMap{ Data: map[string]string{ - "mounted.conf": configuration, + "gnb.conf": configuration, }, ObjectMeta: metav1.ObjectMeta{ Name: "oai-gnb-cu-cp-configmap", @@ -205,8 +205,8 @@ func (resource CuCpResources) GetDeployment(log logr.Logger, ranDeployment *work corev1.VolumeMount{ Name: "configuration", ReadOnly: false, - SubPath: "mounted.conf", - MountPath: "/opt/oai-gnb/etc/mounted.conf", + SubPath: "gnb.conf", + MountPath: "/opt/oai-gnb/etc/gnb.conf", }, }, Env: []corev1.EnvVar{ @@ -218,13 +218,16 @@ func (resource CuCpResources) GetDeployment(log logr.Logger, ranDeployment *work corev1.EnvVar{ Name: "USE_ADDITIONAL_OPTIONS", Value: "--sa --log_config.global_log_options level,nocolor,time", + // " --gNBs.[0].E1_INTERFACE.[0].ipv4_cucp 192.168.77.2" + + // " --gNBs.[0].local_s_address 192.168.72.2", }, corev1.EnvVar{ Name: "USE_VOLUMED_CONF", Value: "yes", }, }, - Image: paramsOAI.Spec.Image, + // Image: paramsOAI.Spec.Image, + Image: "arorasagar/testing-images:oai-gnb-telnet", Ports: []corev1.ContainerPort{ corev1.ContainerPort{ diff --git a/internal/controller/resources_cuup.go b/internal/controller/resources_cuup.go index 5718905..df38d60 100644 --- a/internal/controller/resources_cuup.go +++ b/internal/controller/resources_cuup.go @@ -97,10 +97,10 @@ func (resource CuUpResources) GetDeployment(log logr.Logger, ranDeployment *work VolumeMounts: []corev1.VolumeMount{ corev1.VolumeMount{ - MountPath: "/opt/oai-gnb/etc/mounted.conf", + MountPath: "/opt/oai-gnb/etc/gnb.conf", Name: "configuration", ReadOnly: false, - SubPath: "mounted.conf", + SubPath: "gnb.conf", }, }, Env: []corev1.EnvVar{ @@ -111,7 +111,11 @@ func (resource CuUpResources) GetDeployment(log logr.Logger, ranDeployment *work }, corev1.EnvVar{ Name: "USE_ADDITIONAL_OPTIONS", - Value: "--sa", + Value: "--sa --log_config.global_log_options level,nocolor,time", + // " --gNBs.[0].E1_INTERFACE.[0].ipv4_cucp 192.168.77.2" + + // " --gNBs.[0].E1_INTERFACE.[0].ipv4_cuup 192.168.77.3" + + // " --gNBs.[0].local_s_address 192.168.73.2" + + // " --gNBs.[0].remote_s_address 127.0.0.1", }, corev1.EnvVar{ Name: "USE_VOLUMED_CONF", @@ -142,8 +146,11 @@ func (resource CuUpResources) GetDeployment(log logr.Logger, ranDeployment *work Stdin: false, StdinOnce: false, TTY: false, - Image: paramsOAI.Spec.Image, - Name: "gnbcuup", + // Image: paramsOAI.Spec.Image, + Image: "oaisoftwarealliance/oai-nr-cuup:v2.1.0", + // Image: "nginx:latest", + // Command: []string{"tail", "-f", "dev/null"}, + Name: "gnbcuup", }, }, DNSPolicy: corev1.DNSPolicy("ClusterFirst"), @@ -259,7 +266,7 @@ func (resource CuUpResources) GetConfigMap(log logr.Logger, ranDeployment *workl Kind: "ConfigMap", }, Data: map[string]string{ - "mounted.conf": configuration, + "gnb.conf": configuration, }, } diff --git a/internal/controller/resources_du.go b/internal/controller/resources_du.go index 3bb6747..0b2ec96 100644 --- a/internal/controller/resources_du.go +++ b/internal/controller/resources_du.go @@ -98,7 +98,7 @@ func (resource DuResources) GetConfigMap(log logr.Logger, ranDeployment *workloa configMap1 := &corev1.ConfigMap{ Data: map[string]string{ - "mounted.conf": configuration, + "gnb.conf": configuration, }, ObjectMeta: metav1.ObjectMeta{ Name: "oai-gnb-du-configmap", @@ -113,7 +113,6 @@ func (resource DuResources) GetConfigMap(log logr.Logger, ranDeployment *workloa } func (resource DuResources) GetDeployment(log logr.Logger, ranDeployment *workloadv1alpha1.NFDeployment, configInfo *ConfigInfo) []*appsv1.Deployment { - spec := ranDeployment.Spec networkAttachmentDefinitionNetworks, err := resource.createNetworkAttachmentDefinitionNetworks(ranDeployment.Name, &spec) @@ -179,24 +178,34 @@ func (resource DuResources) GetDeployment(log logr.Logger, ranDeployment *worklo corev1.Container{ Env: []corev1.EnvVar{ + // corev1.EnvVar{ + // Name: "TZ", + // Value: "Europe/Paris", + // }, + // corev1.EnvVar{ + // Name: "RFSIMULATOR", + // Value: "server", + // }, corev1.EnvVar{ - Name: "TZ", - Value: "Europe/Paris", - }, - corev1.EnvVar{ - Name: "RFSIMULATOR", - Value: "server", - }, - corev1.EnvVar{ - Name: "USE_ADDITIONAL_OPTIONS", - Value: "--sa --rfsim --log_config.global_log_options level,nocolor,time", - }, - corev1.EnvVar{ - Name: "USE_VOLUMED_CONF", - Value: "yes", + Name: "USE_ADDITIONAL_OPTIONS", + Value: "--sa --rfsim --log_config.global_log_options level,nocolor,time" + + // " --MACRLCs.[0].local_n_address 192.168.73.3" + + // " --MACRLCs.[0].remote_n_address 192.168.72.2" + + " --telnetsrv --telnetsrv.shrmod o1 --telnetsrv.listenaddr 192.168.74.2", }, + // corev1.EnvVar{ + // Name: "USE_VOLUMED_CONF", + // Value: "yes", + // }, + // corev1.EnvVar{ + // Name: "ASAN_OPTIONS", + // Value: "detect_leaks=0", + // }, }, - Image: paramsOAI.Spec.Image, + // Image: paramsOAI.Spec.Image, + Image: "arorasagar/testing-images:oai-gnb-telnet", + // Image: "nginx:latest", + // Command: []string{"tail", "-f", "dev/null"}, Ports: []corev1.ContainerPort{ corev1.ContainerPort{ @@ -217,8 +226,8 @@ func (resource DuResources) GetDeployment(log logr.Logger, ranDeployment *worklo corev1.VolumeMount{ Name: "configuration", ReadOnly: false, - SubPath: "mounted.conf", - MountPath: "/opt/oai-gnb/etc/mounted.conf", + SubPath: "gnb.conf", + MountPath: "/opt/oai-gnb/etc/gnb.conf", }, }, Name: "gnbdu", diff --git a/internal/controller/templates.go b/internal/controller/templates.go index 6990aee..e916692 100644 --- a/internal/controller/templates.go +++ b/internal/controller/templates.go @@ -591,6 +591,11 @@ var ( configurationTemplateForCuCp = template.Must(template.New("RanCuCpConfiguration").Parse(configurationTemplateSourceForCuCp)) configurationTemplateForCuUp = template.Must(template.New("RanCuUpConfiguration").Parse(configurationTemplateSourceForCuUp)) configurationTemplateForDu = template.Must(template.New("RanDuConfiguration").Parse(configurationTemplateSourceForDu)) + + // O1-Telnet + configurationTemplateForCuCpO1Telnet = template.Must(template.New("RanCuCpConfigurationO1").Parse(configurationTemplateSourceForCuCpO1Telnet)) + configurationTemplateForCuUpO1Telnet = template.Must(template.New("RanCuUpConfigurationO1").Parse(configurationTemplateSourceForCuUpO1Telnet)) + configurationTemplateForDuO1Telnet = template.Must(template.New("RanDuConfigurationO1").Parse(configurationTemplateSourceForDuO1Telnet)) ) type configurationTemplateValuesForCuCp struct { @@ -648,7 +653,23 @@ type configurationTemplateValuesForDu struct { func renderConfigurationTemplateForCuCp(values configurationTemplateValuesForCuCp) (string, error) { var buffer bytes.Buffer - if err := configurationTemplateForCuCp.Execute(&buffer, values); err == nil { + // Overriding Values for Cucp for O1-Telenet + values.TAC = 1 + values.PLMN_MCC = "001" + values.PLMN_MNC = "01" + values.PLMN_MNC_LENGTH = "2" + values.NSSAI_SST = 1 + values.NSSAI_SD = "ffffff" + values.CELL_ID = "12345678L" + values.PHY_CELL_ID = 0 + values.DL_FREQ_BAND = 78 + values.DL_SCS = 1 + values.DL_CARRIER_BW = 51 + values.UL_FREQ_BAND = 78 + values.UL_SCS = 1 + values.UL_CARRIER_BW = 51 + + if err := configurationTemplateForCuCpO1Telnet.Execute(&buffer, values); err == nil { return buffer.String(), nil } else { return "", err @@ -657,7 +678,15 @@ func renderConfigurationTemplateForCuCp(values configurationTemplateValuesForCuC func renderConfigurationTemplateForCuUp(values configurationTemplateValuesForCuUp) (string, error) { var buffer bytes.Buffer - if err := configurationTemplateForCuUp.Execute(&buffer, values); err == nil { + // Overriding Values for Cuup for O1-Telenet + values.TAC = 1 + values.PLMN_MCC = "001" + values.PLMN_MNC = "01" + values.PLMN_MNC_LENGTH = "2" + values.NSSAI_SST = 1 + values.NSSAI_SD = "ffffff" + + if err := configurationTemplateForCuUpO1Telnet.Execute(&buffer, values); err == nil { return buffer.String(), nil } else { return "", err @@ -666,7 +695,23 @@ func renderConfigurationTemplateForCuUp(values configurationTemplateValuesForCuU func renderConfigurationTemplateForDu(values configurationTemplateValuesForDu) (string, error) { var buffer bytes.Buffer - if err := configurationTemplateForDu.Execute(&buffer, values); err == nil { + // Overriding Values for Du for O1-Telenet + values.TAC = 1 + values.PLMN_MCC = "001" + values.PLMN_MNC = "01" + values.PLMN_MNC_LENGTH = "2" + values.NSSAI_SST = 1 + values.NSSAI_SD = "ffffff" + values.CELL_ID = "12345678L" + values.PHY_CELL_ID = 0 + values.DL_FREQ_BAND = 78 + values.DL_SCS = 1 + values.DL_CARRIER_BW = 51 + values.UL_FREQ_BAND = 78 + values.UL_SCS = 1 + values.UL_CARRIER_BW = 51 + + if err := configurationTemplateForDuO1Telnet.Execute(&buffer, values); err == nil { return buffer.String(), nil } else { return "", err diff --git a/internal/controller/templates_o1telnet.go b/internal/controller/templates_o1telnet.go new file mode 100644 index 0000000..7b2c094 --- /dev/null +++ b/internal/controller/templates_o1telnet.go @@ -0,0 +1,458 @@ +/* +Copyright 2023 The Nephio Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package controller + +const configurationTemplateSourceForCuCpO1Telnet = ` +Active_gNBs = ( "oai-cu-cp"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; +Num_Threads_PUSCH = 8; +sa = 1; + +gNBs = +( + { + ////////// Identification parameters: + // gNB_CU_ID = 0xe00; + gNB_ID = 0xe00; + +# cell_type = "CELL_MACRO_GNB"; + + gNB_name = "oai-cu-cp"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = {{ .TAC }}; + plmn_list = ({ mcc = {{ .PLMN_MCC }}; + mnc = {{ .PLMN_MNC }}; + mnc_length ={{ .PLMN_MNC_LENGTH }}; + snssaiList = ({ sst = {{ .NSSAI_SST }}, sd = 0x{{ .NSSAI_SD }} }) + }); + + nr_cellid = {{ .CELL_ID }}; + // force_256qam_off = 1; + + tr_s_preference = "f1"; + + local_s_if_name = "f1c"; + local_s_address = {{ .F1C_IP }}; + remote_s_address = "0.0.0.0"; + local_s_portc = 501; + local_s_portd = 2152; + remote_s_portc = 500; + remote_s_portd = 2152; + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + ////////// AMF parameters: + amf_ip_address = ( { ipv4 = {{ .AMF_IP }}; + ipv6 = "0:0:0::0"; + active = "yes"; + preference = "ipv4"; + } + ); + + E1_INTERFACE = + ( + { + type = "cp"; + ipv4_cucp = {{ .E1_IP }}; + port_cucp = 38462; + ipv4_cuup = "0.0.0.0"; + port_cuup = 38462; + } + ) + + NETWORK_INTERFACES : + { + GNB_INTERFACE_NAME_FOR_NG_AMF = "n2"; + GNB_IPV4_ADDRESS_FOR_NG_AMF = {{ .N2_IP }}; + }; + } +); + +security = { + # preferred ciphering algorithms + # the first one of the list that an UE supports in chosen + # valid values: nea0, nea1, nea2, nea3 + ciphering_algorithms = ( "nea0" ); + + # preferred integrity algorithms + # the first one of the list that an UE supports in chosen + # valid values: nia0, nia1, nia2, nia3 + integrity_algorithms = ( "nia2", "nia0" ); + + # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter + # what 'ciphering_algorithms' configures; same thing for 'drb_integrity' + drb_ciphering = "yes"; + drb_integrity = "no"; +}; + log_config : + { + global_log_level ="info"; + hw_log_level ="info"; + phy_log_level ="info"; + mac_log_level ="info"; + rlc_log_level ="debug"; + pdcp_log_level ="info"; + rrc_log_level ="info"; + f1ap_log_level ="info"; + ngap_log_level ="debug"; + }; + +` + +const configurationTemplateSourceForCuUpO1Telnet = ` +Active_gNBs = ( "oai-cu-up"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; +sa = 1; +gNBs = +( + { + ////////// Identification parameters: + gNB_ID = 0xe00; + gNB_CU_UP_ID = 0xe00; + +# cell_type = "CELL_MACRO_GNB"; + + gNB_name = "oai-cu-up"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = {{ .TAC }}; + plmn_list = ({ mcc = {{ .PLMN_MCC }}; + mnc = {{ .PLMN_MNC }}; + mnc_length ={{ .PLMN_MNC_LENGTH }}; + snssaiList = ({ sst = {{ .NSSAI_SST }}, sd = 0x{{ .NSSAI_SD }} }) + }); + + tr_s_preference = "f1"; + + local_s_if_name = "f1u"; + local_s_address = {{ .F1U_IP }}; + remote_s_address = "0.0.0.0"; + local_s_portc = 501; + local_s_portd = 2152; + remote_s_portc = 500; + remote_s_portd = 2152; + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + E1_INTERFACE = + ( + { + type = "up"; + ipv4_cucp = {{ .CUCP_E1 }}; + ipv4_cuup = {{ .E1_IP }}; + } + ) + + NETWORK_INTERFACES : + { + GNB_INTERFACE_NAME_FOR_NG_AMF = "n3"; + GNB_IPV4_ADDRESS_FOR_NG_AMF = {{ .N3_IP }}; + GNB_INTERFACE_NAME_FOR_NGU = "n3"; + GNB_IPV4_ADDRESS_FOR_NGU = {{ .N3_IP }}; + GNB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + } +); + +security = { + # preferred ciphering algorithms + # the first one of the list that an UE supports in chosen + # valid values: nea0, nea1, nea2, nea3 + ciphering_algorithms = ( "nea0" ); + + # preferred integrity algorithms + # the first one of the list that an UE supports in chosen + # valid values: nia0, nia1, nia2, nia3 + integrity_algorithms = ( "nia2", "nia0" ); + + # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter + # what 'ciphering_algorithms' configures; same thing for 'drb_integrity' + drb_ciphering = "yes"; + drb_integrity = "no"; +}; + + + log_config : + { + global_log_level ="info"; + hw_log_level ="info"; + phy_log_level ="info"; + mac_log_level ="info"; + rlc_log_level ="debug"; + pdcp_log_level ="info"; + rrc_log_level ="info"; + f1ap_log_level ="info"; + ngap_log_level ="debug"; + }; +` + +const configurationTemplateSourceForDuO1Telnet = ` +Active_gNBs = ( "du-rfsim"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +gNBs = +( + { + ////////// Identification parameters: + gNB_ID = 0xe00; + gNB_DU_ID = 0xe00; + +# cell_type = "CELL_MACRO_GNB"; + + gNB_name = "du-rfsim"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = {{ .TAC }}; + plmn_list = ({ mcc = {{ .PLMN_MCC }}; mnc = {{ .PLMN_MNC }}; mnc_length = {{ .PLMN_MNC_LENGTH }}; snssaiList = ({ sst = {{ .NSSAI_SST }}, sd = 0x{{ .NSSAI_SD }} }) }); + + + nr_cellid = {{ .CELL_ID }}; + + ////////// Physical parameters: + + min_rxtxtime = 6; + // force_256qam_off = 1; + + servingCellConfigCommon = ( + { + #spCellConfigCommon + + physCellId = {{ .PHY_CELL_ID }}; + +# downlinkConfigCommon + #frequencyInfoDL + # this is 3410.4 MHz => 301 REs from PointA 25 PRBs + 1 RE + absoluteFrequencySSB = 630048; + dl_frequencyBand = {{ .DL_FREQ_BAND }}; + # this is 3410.4 - (51*12*30e-3/2) = 3401.22 MHz + dl_absoluteFrequencyPointA = 629436; + #scs-SpecificCarrierList + dl_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_subcarrierSpacing = {{ .DL_SCS }}; + dl_carrierBandwidth = {{ .DL_CARRIER_BW }}; + #initialDownlinkBWP + #genericParameters + # this is RBstart=0,L=50 (275*(L-1))+RBstart + initialDLBWPlocationAndBandwidth = 13750; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialDLBWPsubcarrierSpacing = 1; + #pdcch-ConfigCommon + initialDLBWPcontrolResourceSetZero = 11; # this means shift of 14, so Coreset is in PRBs 1..48, SSB starts at PRB 15 + initialDLBWPsearchSpaceZero = 0; + + #uplinkConfigCommon + #frequencyInfoUL + ul_frequencyBand = {{ .UL_FREQ_BAND }}; + #scs-SpecificCarrierList + ul_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_subcarrierSpacing = {{ .UL_SCS }}; + ul_carrierBandwidth = {{ .UL_CARRIER_BW }}; + pMax = 20; + #initialUplinkBWP + #genericParameters + initialULBWPlocationAndBandwidth = 13750; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialULBWPsubcarrierSpacing = 1; + #rach-ConfigCommon + #rach-ConfigGeneric + prach_ConfigurationIndex = 100; +#prach_msg1_FDM +#0 = one, 1=two, 2=four, 3=eight + prach_msg1_FDM = 0; + prach_msg1_FrequencyStart = 0; + zeroCorrelationZoneConfig = 15; + preambleReceivedTargetPower = -104; +#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) + preambleTransMax = 6; +#powerRampingStep +# 0=dB0,1=dB2,2=dB4,3=dB6 + powerRampingStep = 1; +#ra_ReponseWindow +#1,2,4,8,10,20,40,80 + ra_ResponseWindow = 4; +#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR +#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen + ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3; +#oneHalf (0..15) 4,8,12,16,...60,64 + ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15; +#ra_ContentionResolutionTimer +#(0..7) 8,16,24,32,40,48,56,64 + ra_ContentionResolutionTimer = 7; + rsrp_ThresholdSSB = 19; +#prach-RootSequenceIndex_PR +#1 = 839, 2 = 139 + prach_RootSequenceIndex_PR = 2; + prach_RootSequenceIndex = 1; + # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex + # + msg1_SubcarrierSpacing = 1, +# restrictedSetConfig +# 0=unrestricted, 1=restricted type A, 2=restricted type B + restrictedSetConfig = 0, + + msg3_DeltaPreamble = 1; + p0_NominalWithGrant =-96; + +# pucch-ConfigCommon setup : +# pucchGroupHopping +# 0 = neither, 1= group hopping, 2=sequence hopping + pucchGroupHopping = 0; + hoppingId = 40; + p0_nominal = -96; +# ssb_PositionsInBurs_BitmapPR +# 1=short, 2=medium, 3=long + ssb_PositionsInBurst_PR = 2; + ssb_PositionsInBurst_Bitmap = 1; + +# ssb_periodicityServingCell +# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 + ssb_periodicityServingCell = 2; + +# dmrs_TypeA_position +# 0 = pos2, 1 = pos3 + dmrs_TypeA_Position = 0; + +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + subcarrierSpacing = 1; + + + #tdd-UL-DL-ConfigurationCommon +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + referenceSubcarrierSpacing = 1; + # pattern1 + # dl_UL_TransmissionPeriodicity + # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 + dl_UL_TransmissionPeriodicity = 5; + nrofDownlinkSlots = 2; + nrofDownlinkSymbols = 6; + nrofUplinkSlots = 2; + nrofUplinkSymbols = 4; + + ssPBCH_BlockPower = -25; + } + + ); + + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + } +); + +MACRLCs = ( + { + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "f1"; + local_n_if_name = "f1"; + local_n_address = {{ .F1C_DU_IP }}; + remote_n_address = {{ .F1C_CU_IP }}; + local_n_portc = 500; + local_n_portd = 2152; + remote_n_portc = 501; + remote_n_portd = 2152; + pusch_TargetSNRx10 = 200; + pucch_TargetSNRx10 = 200; + ulsch_max_frame_inactivity = 1; + } +); + +L1s = ( +{ + num_cc = 1; + tr_n_preference = "local_mac"; + prach_dtx_threshold = 200; + pucch0_dtx_threshold = 150; + ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 +} +); + +RUs = ( + { + local_rf = "yes" + nb_tx = 1 + nb_rx = 1 + att_tx = 0 + att_rx = 0; + bands = [78]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 114; + eNB_instances = [0]; + #beamforming 1x4 matrix: + bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000]; + clock_src = "internal"; + } +); + +THREAD_STRUCT = ( + { + #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" + parallel_config = "PARALLEL_SINGLE_THREAD"; + #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" + worker_config = "WORKER_ENABLE"; + } +); +rfsimulator: { +serveraddr = "server"; + serverport = "4043"; + options = (); #("saviq"); or/and "chanmod" + modelname = "AWGN"; + IQfile = "/tmp/rfsimulator.iqs" +} + + log_config : + { + global_log_level ="info"; + hw_log_level ="info"; + phy_log_level ="info"; + mac_log_level ="info"; + rlc_log_level ="info"; + pdcp_log_level ="info"; + rrc_log_level ="info"; + f1ap_log_level ="info"; + ngap_log_level ="debug"; + }; +` From f609531742d416719e9106e80844c93f9c19c378 Mon Sep 17 00:00:00 2001 From: Ashish Jain Date: Fri, 14 Jun 2024 02:33:37 +0530 Subject: [PATCH 02/11] Removing Overridden values --- .../controller/randeployment_controller.go | 2 +- internal/controller/resources_cucp.go | 4 +- internal/controller/resources_cuup.go | 4 +- internal/controller/resources_du.go | 25 +++--------- internal/controller/templates.go | 38 ------------------- 5 files changed, 11 insertions(+), 62 deletions(-) diff --git a/internal/controller/randeployment_controller.go b/internal/controller/randeployment_controller.go index 90a015e..5a4d922 100644 --- a/internal/controller/randeployment_controller.go +++ b/internal/controller/randeployment_controller.go @@ -238,7 +238,7 @@ func (r *RANDeploymentReconciler) GetConfigs(ctx context.Context, ranDeployment func (r *RANDeploymentReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { logger := log.FromContext(ctx).WithValues("RANDeployment", req.NamespacedName) - logger.Info("Local :: Du-Config-Done Reconcile for RANDeployment") + logger.Info("Overridden Values Done:: Reconcile for RANDeployment") instance := &workloadv1alpha1.NFDeployment{} err := r.Get(ctx, req.NamespacedName, instance) if err != nil { diff --git a/internal/controller/resources_cucp.go b/internal/controller/resources_cucp.go index 04c02a9..bbbf883 100644 --- a/internal/controller/resources_cucp.go +++ b/internal/controller/resources_cucp.go @@ -226,8 +226,8 @@ func (resource CuCpResources) GetDeployment(log logr.Logger, ranDeployment *work Value: "yes", }, }, - // Image: paramsOAI.Spec.Image, - Image: "arorasagar/testing-images:oai-gnb-telnet", + Image: paramsOAI.Spec.Image, + // Image: "arorasagar/testing-images:oai-gnb-telnet", Ports: []corev1.ContainerPort{ corev1.ContainerPort{ diff --git a/internal/controller/resources_cuup.go b/internal/controller/resources_cuup.go index df38d60..33a607b 100644 --- a/internal/controller/resources_cuup.go +++ b/internal/controller/resources_cuup.go @@ -146,8 +146,8 @@ func (resource CuUpResources) GetDeployment(log logr.Logger, ranDeployment *work Stdin: false, StdinOnce: false, TTY: false, - // Image: paramsOAI.Spec.Image, - Image: "oaisoftwarealliance/oai-nr-cuup:v2.1.0", + Image: paramsOAI.Spec.Image, + // Image: "oaisoftwarealliance/oai-nr-cuup:v2.1.0", // Image: "nginx:latest", // Command: []string{"tail", "-f", "dev/null"}, Name: "gnbcuup", diff --git a/internal/controller/resources_du.go b/internal/controller/resources_du.go index 0b2ec96..81a78d5 100644 --- a/internal/controller/resources_du.go +++ b/internal/controller/resources_du.go @@ -177,15 +177,6 @@ func (resource DuResources) GetDeployment(log logr.Logger, ranDeployment *worklo corev1.Container{ Env: []corev1.EnvVar{ - - // corev1.EnvVar{ - // Name: "TZ", - // Value: "Europe/Paris", - // }, - // corev1.EnvVar{ - // Name: "RFSIMULATOR", - // Value: "server", - // }, corev1.EnvVar{ Name: "USE_ADDITIONAL_OPTIONS", Value: "--sa --rfsim --log_config.global_log_options level,nocolor,time" + @@ -193,17 +184,13 @@ func (resource DuResources) GetDeployment(log logr.Logger, ranDeployment *worklo // " --MACRLCs.[0].remote_n_address 192.168.72.2" + " --telnetsrv --telnetsrv.shrmod o1 --telnetsrv.listenaddr 192.168.74.2", }, - // corev1.EnvVar{ - // Name: "USE_VOLUMED_CONF", - // Value: "yes", - // }, - // corev1.EnvVar{ - // Name: "ASAN_OPTIONS", - // Value: "detect_leaks=0", - // }, + corev1.EnvVar{ + Name: "ASAN_OPTIONS", + Value: "detect_leaks=0", + }, }, - // Image: paramsOAI.Spec.Image, - Image: "arorasagar/testing-images:oai-gnb-telnet", + Image: paramsOAI.Spec.Image, + // Image: "arorasagar/testing-images:oai-gnb-telnet", // Image: "nginx:latest", // Command: []string{"tail", "-f", "dev/null"}, Ports: []corev1.ContainerPort{ diff --git a/internal/controller/templates.go b/internal/controller/templates.go index e916692..0d2e533 100644 --- a/internal/controller/templates.go +++ b/internal/controller/templates.go @@ -653,21 +653,6 @@ type configurationTemplateValuesForDu struct { func renderConfigurationTemplateForCuCp(values configurationTemplateValuesForCuCp) (string, error) { var buffer bytes.Buffer - // Overriding Values for Cucp for O1-Telenet - values.TAC = 1 - values.PLMN_MCC = "001" - values.PLMN_MNC = "01" - values.PLMN_MNC_LENGTH = "2" - values.NSSAI_SST = 1 - values.NSSAI_SD = "ffffff" - values.CELL_ID = "12345678L" - values.PHY_CELL_ID = 0 - values.DL_FREQ_BAND = 78 - values.DL_SCS = 1 - values.DL_CARRIER_BW = 51 - values.UL_FREQ_BAND = 78 - values.UL_SCS = 1 - values.UL_CARRIER_BW = 51 if err := configurationTemplateForCuCpO1Telnet.Execute(&buffer, values); err == nil { return buffer.String(), nil @@ -678,13 +663,6 @@ func renderConfigurationTemplateForCuCp(values configurationTemplateValuesForCuC func renderConfigurationTemplateForCuUp(values configurationTemplateValuesForCuUp) (string, error) { var buffer bytes.Buffer - // Overriding Values for Cuup for O1-Telenet - values.TAC = 1 - values.PLMN_MCC = "001" - values.PLMN_MNC = "01" - values.PLMN_MNC_LENGTH = "2" - values.NSSAI_SST = 1 - values.NSSAI_SD = "ffffff" if err := configurationTemplateForCuUpO1Telnet.Execute(&buffer, values); err == nil { return buffer.String(), nil @@ -695,22 +673,6 @@ func renderConfigurationTemplateForCuUp(values configurationTemplateValuesForCuU func renderConfigurationTemplateForDu(values configurationTemplateValuesForDu) (string, error) { var buffer bytes.Buffer - // Overriding Values for Du for O1-Telenet - values.TAC = 1 - values.PLMN_MCC = "001" - values.PLMN_MNC = "01" - values.PLMN_MNC_LENGTH = "2" - values.NSSAI_SST = 1 - values.NSSAI_SD = "ffffff" - values.CELL_ID = "12345678L" - values.PHY_CELL_ID = 0 - values.DL_FREQ_BAND = 78 - values.DL_SCS = 1 - values.DL_CARRIER_BW = 51 - values.UL_FREQ_BAND = 78 - values.UL_SCS = 1 - values.UL_CARRIER_BW = 51 - if err := configurationTemplateForDuO1Telnet.Execute(&buffer, values); err == nil { return buffer.String(), nil } else { From 70ae35be19b66ae4a5d1a43bc234077cca14585e Mon Sep 17 00:00:00 2001 From: Ashish Jain Date: Fri, 21 Jun 2024 16:05:50 +0530 Subject: [PATCH 03/11] Adding Watch for ActionConfig CRD --- cmd/main.go | 8 ++ .../controller/randeployment_controller.go | 77 ++++++++++++++++++- 2 files changed, 82 insertions(+), 3 deletions(-) diff --git a/cmd/main.go b/cmd/main.go index 9d22850..22a88d9 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -32,6 +32,8 @@ import ( "sigs.k8s.io/controller-runtime/pkg/log/zap" runscheme "sigs.k8s.io/controller-runtime/pkg/scheme" + actorConfigv1 "actor/api/v1" + refv1alpha1 "github.com/nephio-project/api/references/v1alpha1" workloadv1alpha1 "github.com/nephio-project/api/workload/v1alpha1" "workload.nephio.org/ran_deployment/internal/controller" @@ -107,6 +109,12 @@ func main() { setupLog.Error(err, "Not able to register workload/v1alpha1 NFDeployment kind") } + schemeBuilder = &runscheme.Builder{GroupVersion: actorConfigv1.GroupVersion} + schemeBuilder.Register(&actorConfigv1.ActorConfig{}, &actorConfigv1.ActorConfigList{}) + if err := schemeBuilder.AddToScheme(mgr.GetScheme()); err != nil { + setupLog.Error(err, "Not able to register actorConfigv1 ActorConfig kind") + } + if err = (&controller.RANDeploymentReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), diff --git a/internal/controller/randeployment_controller.go b/internal/controller/randeployment_controller.go index 5a4d922..829408c 100644 --- a/internal/controller/randeployment_controller.go +++ b/internal/controller/randeployment_controller.go @@ -31,8 +31,11 @@ import ( ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" + "sigs.k8s.io/controller-runtime/pkg/handler" "sigs.k8s.io/controller-runtime/pkg/log" + actorConfigv1 "actor/api/v1" + configref "github.com/nephio-project/api/references/v1alpha1" workloadv1alpha1 "github.com/nephio-project/api/workload/v1alpha1" ) @@ -222,6 +225,60 @@ func (r *RANDeploymentReconciler) GetConfigs(ctx context.Context, ranDeployment return configInfo, nil } +func (r *RANDeploymentReconciler) OwnNfConfig(ctx context.Context, ranDeployment *workloadv1alpha1.NFDeployment) error { + namespacedName := types.NamespacedName{Namespace: ranDeployment.Namespace, Name: ranDeployment.Name} + logger := log.FromContext(ctx).WithValues("RANDeployment", namespacedName) + + configsList := ranDeployment.Spec.ParametersRefs + for _, configItem := range configsList { + // Only check for NF-Config + if configItem.APIVersion == "workload.nephio.org/v1alpha1" { + configInstance := &workloadv1alpha1.NFConfig{} + if err := r.Get(ctx, types.NamespacedName{Name: *configItem.Name, Namespace: ranDeployment.Namespace}, configInstance); err != nil { + logger.Error(err, "Config for Self get error") + return err + } + logger.Info("Config for Self:", "configInstance.Name", configInstance.Name) + // Own the kind: NfConfig + if err := controllerutil.SetControllerReference(ranDeployment, configInstance, r.Scheme); err != nil { + return err + } + if err := r.Update(ctx, configInstance); err != nil { + logger.Error(err, "Unable to update NfConfig with OwnerReference | ") + return err + } + + break + } + } + + return nil +} + +func (r *RANDeploymentReconciler) checkAction(ctx context.Context, namespacedName types.NamespacedName) error { + logger := log.FromContext(ctx).WithValues("RANDeployment", namespacedName) + logger.Info("Checking ActionConfig for || " + namespacedName.String()) + // Step-1: If namespacedName refers to a ActionConfig Cr + actorConfigInstance := &actorConfigv1.ActorConfig{} + err := r.Get(ctx, namespacedName, actorConfigInstance) + if err != nil { + return err + } + logger.Info("Confirmed ActionConfig for " + namespacedName.String()) + + // Step-2: Once Confirmed the namespacedName refers to a ActionConfig Cr, Check if Action is required + actionType := actorConfigInstance.Spec.Action + target := actorConfigInstance.Spec.Target + + if actionType == "" { + return nil + } + + logger.Info("Recieved Action Request of Type : " + actionType + "\t And Target : " + target.Name) + + return nil +} + //+kubebuilder:rbac:groups=workload.nephio.org,resources=randeployments,verbs=get;list;watch;create;update;patch;delete //+kubebuilder:rbac:groups=workload.nephio.org,resources=randeployments/status,verbs=get;update;patch //+kubebuilder:rbac:groups=workload.nephio.org,resources=randeployments/finalizers,verbs=update @@ -236,14 +293,19 @@ func (r *RANDeploymentReconciler) GetConfigs(ctx context.Context, ranDeployment // For more details, check Reconcile and its Result here: // - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.15.0/pkg/reconcile func (r *RANDeploymentReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { - logger := log.FromContext(ctx).WithValues("RANDeployment", req.NamespacedName) - logger.Info("Overridden Values Done:: Reconcile for RANDeployment") + // logger.Info("Overridden Values Done:: Reconcile for RANDeployment") + fmt.Println("Reconciler for namespacedName :: ", req.NamespacedName, " \n:: ", req.String()) instance := &workloadv1alpha1.NFDeployment{} err := r.Get(ctx, req.NamespacedName, instance) if err != nil { if errors.IsNotFound(err) { - logger.Info("RANDeployment resource not found, ignoring because object must be deleted") + // Either the resource is deleted or Watch has called the reconcile + err = r.checkAction(ctx, req.NamespacedName) + if err != nil { + logger.Info("RANDeployment resource not found, ignoring because object must be deleted") + } + return ctrl.Result{}, nil } logger.Error(err, "Failed to get RANDeployment") @@ -284,6 +346,10 @@ func (r *RANDeploymentReconciler) Reconcile(ctx context.Context, req ctrl.Reques logger.Info("--- Creation for DU") duResource := DuResources{} r.CreateAll(ctx, instance, duResource, configInfo) + // Add a NfConfig Listeners (Own) + // if err := r.OwnNfConfig(ctx, instance); err != nil { + // logger.Error(err, " | While Setting OwnerReference") + // } logger.Info("--- DU Created") } @@ -333,5 +399,10 @@ func (r *RANDeploymentReconciler) Reconcile(ctx context.Context, req ctrl.Reques func (r *RANDeploymentReconciler) SetupWithManager(mgr ctrl.Manager) error { return ctrl.NewControllerManagedBy(mgr). For(&workloadv1alpha1.NFDeployment{}). + Watches(&actorConfigv1.ActorConfig{}, &handler.EnqueueRequestForObject{}). Complete(r) } + +// Watches( +// &source.Kind{Type: &actorConfigv1.ActorConfig{}}, +// &handler.EnqueueRequestForObject{}). From 5a66e224cc573bdb89d8287490d4a108c1b09564 Mon Sep 17 00:00:00 2001 From: Ashish Jain Date: Fri, 21 Jun 2024 16:07:25 +0530 Subject: [PATCH 04/11] Adding Service for O1-Telnet --- internal/controller/resources_du.go | 32 ++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/internal/controller/resources_du.go b/internal/controller/resources_du.go index 81a78d5..b1bfa8d 100644 --- a/internal/controller/resources_du.go +++ b/internal/controller/resources_du.go @@ -305,5 +305,35 @@ func (resource DuResources) GetService() []*corev1.Service { }, } - return []*corev1.Service{service1} + // O1-Telent Service + service2 := &corev1.Service{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "v1", + Kind: "Service", + }, + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{ + "app.kubernetes.io/name": "oai-gnb-du-o1-telnet", + }, + Name: "oai-gnb-du-o1-telnet", + }, + Spec: corev1.ServiceSpec{ + Selector: map[string]string{ + "app.kubernetes.io/name": "oai-gnb-du", + }, + Type: corev1.ServiceType("ClusterIP"), + ClusterIP: "None", + Ports: []corev1.ServicePort{ + corev1.ServicePort{ + Port: 9090, + Protocol: corev1.Protocol("TCP"), + TargetPort: intstr.IntOrString{ + IntVal: 9090, + }, + }, + }, + }, + } + + return []*corev1.Service{service1, service2} } From b7bf87b6fe4740add6328e11c2e2effd6f219f97 Mon Sep 17 00:00:00 2001 From: Ashish Jain Date: Fri, 21 Jun 2024 16:09:12 +0530 Subject: [PATCH 05/11] Bandwidth-reconfigure-procedure using o1-telnet added --- internal/controller/bandwidth_reconfigure.go | 107 +++++++++++++++++ internal/controller/o1_telnet_client.go | 111 ++++++++++++++++++ .../controller/randeployment_controller.go | 13 ++ 3 files changed, 231 insertions(+) create mode 100644 internal/controller/bandwidth_reconfigure.go create mode 100644 internal/controller/o1_telnet_client.go diff --git a/internal/controller/bandwidth_reconfigure.go b/internal/controller/bandwidth_reconfigure.go new file mode 100644 index 0000000..9fecffd --- /dev/null +++ b/internal/controller/bandwidth_reconfigure.go @@ -0,0 +1,107 @@ +package controller + +import ( + "encoding/json" + "fmt" +) + +/* +If the cmd is successful, the cmdOutput must end with 'OK\n' +*/ +func ValidateCommandRunStatus(cmdOutput string) bool { + n := len(cmdOutput) + if n < 3 { + return false + } + + return cmdOutput[n-3:] == "OK\n" +} + +func GetO1Stats(o1Obj *O1TelnetClient) (any, error) { + cmd := "o1 stats" + cmdOutput, err := o1Obj.RunCommand(cmd) + if err != nil { + return nil, fmt.Errorf("Error in running cmd " + cmd + " :: Err --> " + err.Error()) + } + if !ValidateCommandRunStatus(cmdOutput) { + return nil, fmt.Errorf("OK Not found in cmd output :: cmd --> " + cmd + " :: CmdOutput --> " + cmdOutput) + } + + var data any + err = json.Unmarshal([]byte(cmdOutput[:len(cmdOutput)-3]), &data) + if err != nil { + fmt.Println("Error in Decoding JSON :: " + err.Error()) + return nil, fmt.Errorf("Error in Decoding JSON :: " + err.Error()) + } + + return data, nil +} + +func GetCurrentBW(o1Obj *O1TelnetClient) (string, error) { + data, err := GetO1Stats(o1Obj) + if err != nil { + return "", err + } + // ToDO: Use a whole struct to decode full o1-stats (if useful) + ptr, _ := data.(map[string]any) + for _, fields := range []string{"o1-config", "NRCELLDU"} { + next := ptr[fields] + ptr = next.(map[string]any) + } + + bw := ptr["nrcelldu3gpp:bSChannelBwDL"].(float64) + return fmt.Sprint(bw), nil +} + +/* +The Current Procedure will reconfigure the Bandwidth +ToDo: What if modem is already-Stopped, In that case first cmd will not return 'OK' +*/ +func BandWidthReconfigureProcedure(o1Obj *O1TelnetClient, toValue string) error { + cmds := []string{ + "o1 stop_modem", + "o1 bwconfig " + toValue, + "o1 start_modem", + } + + for _, cmd := range cmds { + cmdOutput, err := o1Obj.RunCommand(cmd) + if err != nil { + return fmt.Errorf("Error in running cmd " + cmd + " :: Err --> " + err.Error()) + } + if !ValidateCommandRunStatus(cmdOutput) { + return fmt.Errorf("OK Not found in cmd output :: cmd --> " + cmd + " :: CmdOutput --> " + cmdOutput) + } + } + return nil +} + +func ReconfigureBandWidth(o1Obj *O1TelnetClient, toValue string) error { + if toValue != "20" && toValue != "40" { + return fmt.Errorf("Allowed values of Bandwidth are either 20 or 40 :: Recieved-Value : " + toValue) + } + + curBW, err := GetCurrentBW(o1Obj) + if err != nil { + return fmt.Errorf("Error Recieved in Quering for BW before reconfiguration| Err --> " + err.Error()) + } + if curBW == toValue { + fmt.Println("Current BW is the required BW | Returning") + return nil + } + + fmt.Println("Reconfiguring BW from " + curBW + " to " + toValue) + err = BandWidthReconfigureProcedure(o1Obj, toValue) + if err != nil { + return fmt.Errorf("Error Recieved in Reconfiguring the BW| Err --> " + err.Error()) + } + // BW is reconfigured (Confirm it) + newBW, err := GetCurrentBW(o1Obj) + if err != nil { + return fmt.Errorf("Error Recieved in Quering for BW after reconfiguration| Err --> " + err.Error()) + } + if newBW != toValue { + return fmt.Errorf("Unkown Error:: BW should have been reconfigured but it is not :(") + } + return nil +} diff --git a/internal/controller/o1_telnet_client.go b/internal/controller/o1_telnet_client.go new file mode 100644 index 0000000..de988af --- /dev/null +++ b/internal/controller/o1_telnet_client.go @@ -0,0 +1,111 @@ +package controller + +import ( + "errors" + "io" + "net" + "strings" + "time" +) + +type O1TelnetClient struct { + url string + port string + conn *net.TCPConn +} + +/* +Opens a TCP connection to 'url:port' {Timeout of 5 sec} +*/ +func (o *O1TelnetClient) openConnection() error { + svc := o.url + ":" + o.port + tcpServer, err := net.ResolveTCPAddr("tcp", svc) + if err != nil { + return err + } + d := net.Dialer{Timeout: 5 * time.Second} + conn, err := d.Dial("tcp", tcpServer.String()) + if err != nil { + return err + } + + o.conn = conn.(*net.TCPConn) + return nil +} + +func (o *O1TelnetClient) closeConnection() error { + if o.conn == nil { + // fmt.Println("Connection was already closed or never opened") + return nil + } + o.conn.Close() + return nil +} + +/* +Writes to the tcp channel +*/ +func (o *O1TelnetClient) writeToConnection(cmd string) error { + _, err := o.conn.Write([]byte(cmd + "\n")) + if err != nil { + return err + } + return nil +} + +/* +Reads From the tcp channel +A Brief About the Logic: +It is observed that the telnet doesn't send EOF at the end of message due to following readers fails: +1. net.conn.Read +2. telent.conn.Read +3. ioutil.ReadAll +4. textproto.NewReader +Since, they keep reading until they don't find EOF (which they will never find :( ) +As a work-around: we follow 2 cases: +1. It is seen that every telent message ends with 'softmodem_gnb', we will treat that as EOF +2. Set a ReadDeadline (generally 5 sec) to prevent infinite-loop +*/ +func (o *O1TelnetClient) readFromConnection() (string, error) { + var out, curLine string + tmp := make([]byte, 1) // Read the charactor + for { + o.conn.SetReadDeadline(time.Now().Add(5 * time.Second)) + _, err := o.conn.Read(tmp) + if err != nil { + if err != io.EOF && !strings.Contains(err.Error(), "i/o timeout") { + return out, err + } + break + } + curChar := string(tmp) + if curChar == "\n" { // End of Line + out += (curLine + "\n") + curLine = "" + } else { + curLine += curChar + } + + if curLine == "softmodem_gnb" { // It is treated as EOF + break + } + } + return out, nil +} + +func (o *O1TelnetClient) RunCommand(cmd string) (string, error) { + if err := o.openConnection(); err != nil { + return "", errors.New("Unable to open-connection :: " + err.Error()) + } + defer o.closeConnection() + + if err := o.writeToConnection(cmd); err != nil { + return "", errors.New("Unable to write-Command :: " + err.Error()) + } + + out, err := o.readFromConnection() + if err != nil { + return "", errors.New("Unable to read-Command-Output :: " + err.Error()) + } + return out, nil +} diff --git a/internal/controller/randeployment_controller.go b/internal/controller/randeployment_controller.go index 829408c..42f43ff 100644 --- a/internal/controller/randeployment_controller.go +++ b/internal/controller/randeployment_controller.go @@ -275,6 +275,19 @@ func (r *RANDeploymentReconciler) checkAction(ctx context.Context, namespacedNam } logger.Info("Recieved Action Request of Type : " + actionType + "\t And Target : " + target.Name) + if actionType == "bw-reconfigure" { + + o1Obj := O1TelnetClient{ + url: "oai-gnb-du-o1-telnet." + target.Namespace + ".svc.cluster.local", + port: "9090", + conn: nil, + } + err := ReconfigureBandWidth(&o1Obj, target.Value) + if err != nil { + logger.Info("Error in Reconfiguring BW :: " + err.Error()) + } + logger.Info("Bandwidth Reconfigured Successfully") + } return nil } From 8eea97695d36a13340c8084563fb5cd91e9700b4 Mon Sep 17 00:00:00 2001 From: Ashish Jain Date: Fri, 21 Jun 2024 16:10:45 +0530 Subject: [PATCH 06/11] Temp Support for ActorConfig CRD --- Dockerfile | 3 + actor/actorConfig/api/v1/actorconfig_types.go | 73 +++++++++++ actor/actorConfig/api/v1/groupversion_info.go | 36 ++++++ .../api/v1/zz_generated.deepcopy.go | 114 ++++++++++++++++++ actor/actorConfig/go.mod | 29 +++++ actor/actorConfig/go.sum | 109 +++++++++++++++++ 6 files changed, 364 insertions(+) create mode 100644 actor/actorConfig/api/v1/actorconfig_types.go create mode 100644 actor/actorConfig/api/v1/groupversion_info.go create mode 100644 actor/actorConfig/api/v1/zz_generated.deepcopy.go create mode 100644 actor/actorConfig/go.mod create mode 100644 actor/actorConfig/go.sum diff --git a/Dockerfile b/Dockerfile index 12c68eb..e72984e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,6 +16,9 @@ COPY cmd/main.go cmd/main.go COPY internal/controller/ internal/controller/ COPY api api +# A Temporary-WorkAround for controller to know about the actorConfig CRD +COPY actor/actorConfig/ /usr/local/go/src/actor + # Build # the GOARCH has not a default value to allow the binary be built according to the host where the command # was called. For example, if we call make docker-build in a local env which has the Apple Silicon M1 SO diff --git a/actor/actorConfig/api/v1/actorconfig_types.go b/actor/actorConfig/api/v1/actorconfig_types.go new file mode 100644 index 0000000..7b2c5dc --- /dev/null +++ b/actor/actorConfig/api/v1/actorconfig_types.go @@ -0,0 +1,73 @@ +/* +Copyright 2024. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN! +// NOTE: json tags are required. Any new fields you add must have json tags for the fields to be serialized. +type TargetSpec struct { + // Name of Target-Package + Name string `json:"name,omitempty"` + // Namespace of Target-Package + Namespace string `json:"namespace,omitempty"` + // Value to change in target + Value string `json:"value,omitempty"` +} + +// ActorConfigSpec defines the desired state of ActorConfig +type ActorConfigSpec struct { + // INSERT ADDITIONAL SPEC FIELDS - desired state of cluster + // Important: Run "make" to regenerate code after modifying this file + + // Action can either be 'reconfigure' or empty (as of now) + Action string `json:"action,omitempty"` + Target TargetSpec `json:"target,omitempty"` +} + +// ActorConfigStatus defines the observed state of ActorConfig +type ActorConfigStatus struct { + // INSERT ADDITIONAL STATUS FIELD - define observed state of cluster + // Important: Run "make" to regenerate code after modifying this file +} + +// +kubebuilder:object:root=true +// +kubebuilder:subresource:status + +// ActorConfig is the Schema for the actorconfigs API +type ActorConfig struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Spec ActorConfigSpec `json:"spec,omitempty"` + Status ActorConfigStatus `json:"status,omitempty"` +} + +// +kubebuilder:object:root=true + +// ActorConfigList contains a list of ActorConfig +type ActorConfigList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitempty"` + Items []ActorConfig `json:"items"` +} + +func init() { + SchemeBuilder.Register(&ActorConfig{}, &ActorConfigList{}) +} diff --git a/actor/actorConfig/api/v1/groupversion_info.go b/actor/actorConfig/api/v1/groupversion_info.go new file mode 100644 index 0000000..592431e --- /dev/null +++ b/actor/actorConfig/api/v1/groupversion_info.go @@ -0,0 +1,36 @@ +/* +Copyright 2024. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Package v1 contains API Schema definitions for the actor v1 API group +// +kubebuilder:object:generate=true +// +groupName=actor.github.com +package v1 + +import ( + "k8s.io/apimachinery/pkg/runtime/schema" + "sigs.k8s.io/controller-runtime/pkg/scheme" +) + +var ( + // GroupVersion is group version used to register these objects + GroupVersion = schema.GroupVersion{Group: "actor.github.com", Version: "v1"} + + // SchemeBuilder is used to add go types to the GroupVersionKind scheme + SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion} + + // AddToScheme adds the types in this group-version to the given scheme. + AddToScheme = SchemeBuilder.AddToScheme +) diff --git a/actor/actorConfig/api/v1/zz_generated.deepcopy.go b/actor/actorConfig/api/v1/zz_generated.deepcopy.go new file mode 100644 index 0000000..33c0a17 --- /dev/null +++ b/actor/actorConfig/api/v1/zz_generated.deepcopy.go @@ -0,0 +1,114 @@ +//go:build !ignore_autogenerated + +/* +Copyright 2024. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by controller-gen. DO NOT EDIT. + +package v1 + +import ( + runtime "k8s.io/apimachinery/pkg/runtime" +) + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ActorConfig) DeepCopyInto(out *ActorConfig) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + out.Spec = in.Spec + out.Status = in.Status +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ActorConfig. +func (in *ActorConfig) DeepCopy() *ActorConfig { + if in == nil { + return nil + } + out := new(ActorConfig) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ActorConfig) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ActorConfigList) DeepCopyInto(out *ActorConfigList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]ActorConfig, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ActorConfigList. +func (in *ActorConfigList) DeepCopy() *ActorConfigList { + if in == nil { + return nil + } + out := new(ActorConfigList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ActorConfigList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ActorConfigSpec) DeepCopyInto(out *ActorConfigSpec) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ActorConfigSpec. +func (in *ActorConfigSpec) DeepCopy() *ActorConfigSpec { + if in == nil { + return nil + } + out := new(ActorConfigSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ActorConfigStatus) DeepCopyInto(out *ActorConfigStatus) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ActorConfigStatus. +func (in *ActorConfigStatus) DeepCopy() *ActorConfigStatus { + if in == nil { + return nil + } + out := new(ActorConfigStatus) + in.DeepCopyInto(out) + return out +} diff --git a/actor/actorConfig/go.mod b/actor/actorConfig/go.mod new file mode 100644 index 0000000..0a62068 --- /dev/null +++ b/actor/actorConfig/go.mod @@ -0,0 +1,29 @@ +module actor + +go 1.22.0 + +toolchain go1.22.4 + +require ( + k8s.io/apimachinery v0.30.0 + sigs.k8s.io/controller-runtime v0.18.2 +) + +require ( + github.com/go-logr/logr v1.4.1 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/google/gofuzz v1.2.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + golang.org/x/net v0.23.0 // indirect + golang.org/x/text v0.14.0 // indirect + gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + k8s.io/klog/v2 v2.120.1 // indirect + k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect +) diff --git a/actor/actorConfig/go.sum b/actor/actorConfig/go.sum new file mode 100644 index 0000000..bebc974 --- /dev/null +++ b/actor/actorConfig/go.sum @@ -0,0 +1,109 @@ +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/onsi/ginkgo/v2 v2.17.1 h1:V++EzdbhI4ZV4ev0UTIj0PzhzOcReJFyJaLjtSF55M8= +github.com/onsi/ginkgo/v2 v2.17.1/go.mod h1:llBI3WDLL9Z6taip6f33H76YcWtJv+7R3HigUjbIBOs= +github.com/onsi/gomega v1.32.0 h1:JRYU78fJ1LPxlckP6Txi/EYqJvjtMrDC04/MM5XRHPk= +github.com/onsi/gomega v1.32.0/go.mod h1:a4x4gW6Pz2yK1MAmvluYme5lvYTn61afQ2ETw/8n4Lg= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ= +golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/api v0.30.0 h1:siWhRq7cNjy2iHssOB9SCGNCl2spiF1dO3dABqZ8niA= +k8s.io/api v0.30.0/go.mod h1:OPlaYhoHs8EQ1ql0R/TsUgaRPhpKNxIMrKQfWUp8QSE= +k8s.io/apimachinery v0.30.0 h1:qxVPsyDM5XS96NIh9Oj6LavoVFYff/Pon9cZeDIkHHA= +k8s.io/apimachinery v0.30.0/go.mod h1:iexa2somDaxdnj7bha06bhb43Zpa6eWH8N8dbqVjTUc= +k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= +k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/controller-runtime v0.18.2 h1:RqVW6Kpeaji67CY5nPEfRz6ZfFMk0lWQlNrLqlNpx+Q= +sigs.k8s.io/controller-runtime v0.18.2/go.mod h1:tuAt1+wbVsXIT8lPtk5RURxqAnq7xkpv2Mhttslg7Hw= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= +sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= +sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= From aad2cdff5598eafd29576910557eeda9fe0f9ff4 Mon Sep 17 00:00:00 2001 From: Ashish Jain Date: Fri, 28 Jun 2024 00:13:50 +0530 Subject: [PATCH 07/11] Rolling back to O1-telnet-enabled-du --- Dockerfile | 2 - actor/actorConfig/api/v1/actorconfig_types.go | 73 ----------- actor/actorConfig/api/v1/groupversion_info.go | 36 ------ .../api/v1/zz_generated.deepcopy.go | 114 ------------------ actor/actorConfig/go.mod | 29 ----- actor/actorConfig/go.sum | 109 ----------------- cmd/main.go | 8 -- internal/controller/bandwidth_reconfigure.go | 107 ---------------- internal/controller/o1_telnet_client.go | 111 ----------------- .../controller/randeployment_controller.go | 87 +------------ 10 files changed, 4 insertions(+), 672 deletions(-) delete mode 100644 actor/actorConfig/api/v1/actorconfig_types.go delete mode 100644 actor/actorConfig/api/v1/groupversion_info.go delete mode 100644 actor/actorConfig/api/v1/zz_generated.deepcopy.go delete mode 100644 actor/actorConfig/go.mod delete mode 100644 actor/actorConfig/go.sum delete mode 100644 internal/controller/bandwidth_reconfigure.go delete mode 100644 internal/controller/o1_telnet_client.go diff --git a/Dockerfile b/Dockerfile index e72984e..19f248f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,8 +16,6 @@ COPY cmd/main.go cmd/main.go COPY internal/controller/ internal/controller/ COPY api api -# A Temporary-WorkAround for controller to know about the actorConfig CRD -COPY actor/actorConfig/ /usr/local/go/src/actor # Build # the GOARCH has not a default value to allow the binary be built according to the host where the command diff --git a/actor/actorConfig/api/v1/actorconfig_types.go b/actor/actorConfig/api/v1/actorconfig_types.go deleted file mode 100644 index 7b2c5dc..0000000 --- a/actor/actorConfig/api/v1/actorconfig_types.go +++ /dev/null @@ -1,73 +0,0 @@ -/* -Copyright 2024. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package v1 - -import ( - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN! -// NOTE: json tags are required. Any new fields you add must have json tags for the fields to be serialized. -type TargetSpec struct { - // Name of Target-Package - Name string `json:"name,omitempty"` - // Namespace of Target-Package - Namespace string `json:"namespace,omitempty"` - // Value to change in target - Value string `json:"value,omitempty"` -} - -// ActorConfigSpec defines the desired state of ActorConfig -type ActorConfigSpec struct { - // INSERT ADDITIONAL SPEC FIELDS - desired state of cluster - // Important: Run "make" to regenerate code after modifying this file - - // Action can either be 'reconfigure' or empty (as of now) - Action string `json:"action,omitempty"` - Target TargetSpec `json:"target,omitempty"` -} - -// ActorConfigStatus defines the observed state of ActorConfig -type ActorConfigStatus struct { - // INSERT ADDITIONAL STATUS FIELD - define observed state of cluster - // Important: Run "make" to regenerate code after modifying this file -} - -// +kubebuilder:object:root=true -// +kubebuilder:subresource:status - -// ActorConfig is the Schema for the actorconfigs API -type ActorConfig struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - - Spec ActorConfigSpec `json:"spec,omitempty"` - Status ActorConfigStatus `json:"status,omitempty"` -} - -// +kubebuilder:object:root=true - -// ActorConfigList contains a list of ActorConfig -type ActorConfigList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata,omitempty"` - Items []ActorConfig `json:"items"` -} - -func init() { - SchemeBuilder.Register(&ActorConfig{}, &ActorConfigList{}) -} diff --git a/actor/actorConfig/api/v1/groupversion_info.go b/actor/actorConfig/api/v1/groupversion_info.go deleted file mode 100644 index 592431e..0000000 --- a/actor/actorConfig/api/v1/groupversion_info.go +++ /dev/null @@ -1,36 +0,0 @@ -/* -Copyright 2024. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package v1 contains API Schema definitions for the actor v1 API group -// +kubebuilder:object:generate=true -// +groupName=actor.github.com -package v1 - -import ( - "k8s.io/apimachinery/pkg/runtime/schema" - "sigs.k8s.io/controller-runtime/pkg/scheme" -) - -var ( - // GroupVersion is group version used to register these objects - GroupVersion = schema.GroupVersion{Group: "actor.github.com", Version: "v1"} - - // SchemeBuilder is used to add go types to the GroupVersionKind scheme - SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion} - - // AddToScheme adds the types in this group-version to the given scheme. - AddToScheme = SchemeBuilder.AddToScheme -) diff --git a/actor/actorConfig/api/v1/zz_generated.deepcopy.go b/actor/actorConfig/api/v1/zz_generated.deepcopy.go deleted file mode 100644 index 33c0a17..0000000 --- a/actor/actorConfig/api/v1/zz_generated.deepcopy.go +++ /dev/null @@ -1,114 +0,0 @@ -//go:build !ignore_autogenerated - -/* -Copyright 2024. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by controller-gen. DO NOT EDIT. - -package v1 - -import ( - runtime "k8s.io/apimachinery/pkg/runtime" -) - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ActorConfig) DeepCopyInto(out *ActorConfig) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - out.Spec = in.Spec - out.Status = in.Status -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ActorConfig. -func (in *ActorConfig) DeepCopy() *ActorConfig { - if in == nil { - return nil - } - out := new(ActorConfig) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *ActorConfig) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ActorConfigList) DeepCopyInto(out *ActorConfigList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]ActorConfig, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ActorConfigList. -func (in *ActorConfigList) DeepCopy() *ActorConfigList { - if in == nil { - return nil - } - out := new(ActorConfigList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *ActorConfigList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ActorConfigSpec) DeepCopyInto(out *ActorConfigSpec) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ActorConfigSpec. -func (in *ActorConfigSpec) DeepCopy() *ActorConfigSpec { - if in == nil { - return nil - } - out := new(ActorConfigSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ActorConfigStatus) DeepCopyInto(out *ActorConfigStatus) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ActorConfigStatus. -func (in *ActorConfigStatus) DeepCopy() *ActorConfigStatus { - if in == nil { - return nil - } - out := new(ActorConfigStatus) - in.DeepCopyInto(out) - return out -} diff --git a/actor/actorConfig/go.mod b/actor/actorConfig/go.mod deleted file mode 100644 index 0a62068..0000000 --- a/actor/actorConfig/go.mod +++ /dev/null @@ -1,29 +0,0 @@ -module actor - -go 1.22.0 - -toolchain go1.22.4 - -require ( - k8s.io/apimachinery v0.30.0 - sigs.k8s.io/controller-runtime v0.18.2 -) - -require ( - github.com/go-logr/logr v1.4.1 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/google/gofuzz v1.2.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/kr/text v0.2.0 // indirect - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/text v0.14.0 // indirect - gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - k8s.io/klog/v2 v2.120.1 // indirect - k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect - sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect -) diff --git a/actor/actorConfig/go.sum b/actor/actorConfig/go.sum deleted file mode 100644 index bebc974..0000000 --- a/actor/actorConfig/go.sum +++ /dev/null @@ -1,109 +0,0 @@ -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= -github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/onsi/ginkgo/v2 v2.17.1 h1:V++EzdbhI4ZV4ev0UTIj0PzhzOcReJFyJaLjtSF55M8= -github.com/onsi/ginkgo/v2 v2.17.1/go.mod h1:llBI3WDLL9Z6taip6f33H76YcWtJv+7R3HigUjbIBOs= -github.com/onsi/gomega v1.32.0 h1:JRYU78fJ1LPxlckP6Txi/EYqJvjtMrDC04/MM5XRHPk= -github.com/onsi/gomega v1.32.0/go.mod h1:a4x4gW6Pz2yK1MAmvluYme5lvYTn61afQ2ETw/8n4Lg= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ= -golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -k8s.io/api v0.30.0 h1:siWhRq7cNjy2iHssOB9SCGNCl2spiF1dO3dABqZ8niA= -k8s.io/api v0.30.0/go.mod h1:OPlaYhoHs8EQ1ql0R/TsUgaRPhpKNxIMrKQfWUp8QSE= -k8s.io/apimachinery v0.30.0 h1:qxVPsyDM5XS96NIh9Oj6LavoVFYff/Pon9cZeDIkHHA= -k8s.io/apimachinery v0.30.0/go.mod h1:iexa2somDaxdnj7bha06bhb43Zpa6eWH8N8dbqVjTUc= -k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= -k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= -k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -sigs.k8s.io/controller-runtime v0.18.2 h1:RqVW6Kpeaji67CY5nPEfRz6ZfFMk0lWQlNrLqlNpx+Q= -sigs.k8s.io/controller-runtime v0.18.2/go.mod h1:tuAt1+wbVsXIT8lPtk5RURxqAnq7xkpv2Mhttslg7Hw= -sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= -sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= -sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/cmd/main.go b/cmd/main.go index 22a88d9..9d22850 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -32,8 +32,6 @@ import ( "sigs.k8s.io/controller-runtime/pkg/log/zap" runscheme "sigs.k8s.io/controller-runtime/pkg/scheme" - actorConfigv1 "actor/api/v1" - refv1alpha1 "github.com/nephio-project/api/references/v1alpha1" workloadv1alpha1 "github.com/nephio-project/api/workload/v1alpha1" "workload.nephio.org/ran_deployment/internal/controller" @@ -109,12 +107,6 @@ func main() { setupLog.Error(err, "Not able to register workload/v1alpha1 NFDeployment kind") } - schemeBuilder = &runscheme.Builder{GroupVersion: actorConfigv1.GroupVersion} - schemeBuilder.Register(&actorConfigv1.ActorConfig{}, &actorConfigv1.ActorConfigList{}) - if err := schemeBuilder.AddToScheme(mgr.GetScheme()); err != nil { - setupLog.Error(err, "Not able to register actorConfigv1 ActorConfig kind") - } - if err = (&controller.RANDeploymentReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), diff --git a/internal/controller/bandwidth_reconfigure.go b/internal/controller/bandwidth_reconfigure.go deleted file mode 100644 index 9fecffd..0000000 --- a/internal/controller/bandwidth_reconfigure.go +++ /dev/null @@ -1,107 +0,0 @@ -package controller - -import ( - "encoding/json" - "fmt" -) - -/* -If the cmd is successful, the cmdOutput must end with 'OK\n' -*/ -func ValidateCommandRunStatus(cmdOutput string) bool { - n := len(cmdOutput) - if n < 3 { - return false - } - - return cmdOutput[n-3:] == "OK\n" -} - -func GetO1Stats(o1Obj *O1TelnetClient) (any, error) { - cmd := "o1 stats" - cmdOutput, err := o1Obj.RunCommand(cmd) - if err != nil { - return nil, fmt.Errorf("Error in running cmd " + cmd + " :: Err --> " + err.Error()) - } - if !ValidateCommandRunStatus(cmdOutput) { - return nil, fmt.Errorf("OK Not found in cmd output :: cmd --> " + cmd + " :: CmdOutput --> " + cmdOutput) - } - - var data any - err = json.Unmarshal([]byte(cmdOutput[:len(cmdOutput)-3]), &data) - if err != nil { - fmt.Println("Error in Decoding JSON :: " + err.Error()) - return nil, fmt.Errorf("Error in Decoding JSON :: " + err.Error()) - } - - return data, nil -} - -func GetCurrentBW(o1Obj *O1TelnetClient) (string, error) { - data, err := GetO1Stats(o1Obj) - if err != nil { - return "", err - } - // ToDO: Use a whole struct to decode full o1-stats (if useful) - ptr, _ := data.(map[string]any) - for _, fields := range []string{"o1-config", "NRCELLDU"} { - next := ptr[fields] - ptr = next.(map[string]any) - } - - bw := ptr["nrcelldu3gpp:bSChannelBwDL"].(float64) - return fmt.Sprint(bw), nil -} - -/* -The Current Procedure will reconfigure the Bandwidth -ToDo: What if modem is already-Stopped, In that case first cmd will not return 'OK' -*/ -func BandWidthReconfigureProcedure(o1Obj *O1TelnetClient, toValue string) error { - cmds := []string{ - "o1 stop_modem", - "o1 bwconfig " + toValue, - "o1 start_modem", - } - - for _, cmd := range cmds { - cmdOutput, err := o1Obj.RunCommand(cmd) - if err != nil { - return fmt.Errorf("Error in running cmd " + cmd + " :: Err --> " + err.Error()) - } - if !ValidateCommandRunStatus(cmdOutput) { - return fmt.Errorf("OK Not found in cmd output :: cmd --> " + cmd + " :: CmdOutput --> " + cmdOutput) - } - } - return nil -} - -func ReconfigureBandWidth(o1Obj *O1TelnetClient, toValue string) error { - if toValue != "20" && toValue != "40" { - return fmt.Errorf("Allowed values of Bandwidth are either 20 or 40 :: Recieved-Value : " + toValue) - } - - curBW, err := GetCurrentBW(o1Obj) - if err != nil { - return fmt.Errorf("Error Recieved in Quering for BW before reconfiguration| Err --> " + err.Error()) - } - if curBW == toValue { - fmt.Println("Current BW is the required BW | Returning") - return nil - } - - fmt.Println("Reconfiguring BW from " + curBW + " to " + toValue) - err = BandWidthReconfigureProcedure(o1Obj, toValue) - if err != nil { - return fmt.Errorf("Error Recieved in Reconfiguring the BW| Err --> " + err.Error()) - } - // BW is reconfigured (Confirm it) - newBW, err := GetCurrentBW(o1Obj) - if err != nil { - return fmt.Errorf("Error Recieved in Quering for BW after reconfiguration| Err --> " + err.Error()) - } - if newBW != toValue { - return fmt.Errorf("Unkown Error:: BW should have been reconfigured but it is not :(") - } - return nil -} diff --git a/internal/controller/o1_telnet_client.go b/internal/controller/o1_telnet_client.go deleted file mode 100644 index de988af..0000000 --- a/internal/controller/o1_telnet_client.go +++ /dev/null @@ -1,111 +0,0 @@ -package controller - -import ( - "errors" - "io" - "net" - "strings" - "time" -) - -type O1TelnetClient struct { - url string - port string - conn *net.TCPConn -} - -/* -Opens a TCP connection to 'url:port' {Timeout of 5 sec} -*/ -func (o *O1TelnetClient) openConnection() error { - svc := o.url + ":" + o.port - tcpServer, err := net.ResolveTCPAddr("tcp", svc) - if err != nil { - return err - } - d := net.Dialer{Timeout: 5 * time.Second} - conn, err := d.Dial("tcp", tcpServer.String()) - if err != nil { - return err - } - - o.conn = conn.(*net.TCPConn) - return nil -} - -func (o *O1TelnetClient) closeConnection() error { - if o.conn == nil { - // fmt.Println("Connection was already closed or never opened") - return nil - } - o.conn.Close() - return nil -} - -/* -Writes to the tcp channel -*/ -func (o *O1TelnetClient) writeToConnection(cmd string) error { - _, err := o.conn.Write([]byte(cmd + "\n")) - if err != nil { - return err - } - return nil -} - -/* -Reads From the tcp channel -A Brief About the Logic: -It is observed that the telnet doesn't send EOF at the end of message due to following readers fails: -1. net.conn.Read -2. telent.conn.Read -3. ioutil.ReadAll -4. textproto.NewReader -Since, they keep reading until they don't find EOF (which they will never find :( ) -As a work-around: we follow 2 cases: -1. It is seen that every telent message ends with 'softmodem_gnb', we will treat that as EOF -2. Set a ReadDeadline (generally 5 sec) to prevent infinite-loop -*/ -func (o *O1TelnetClient) readFromConnection() (string, error) { - var out, curLine string - tmp := make([]byte, 1) // Read the charactor - for { - o.conn.SetReadDeadline(time.Now().Add(5 * time.Second)) - _, err := o.conn.Read(tmp) - if err != nil { - if err != io.EOF && !strings.Contains(err.Error(), "i/o timeout") { - return out, err - } - break - } - curChar := string(tmp) - if curChar == "\n" { // End of Line - out += (curLine + "\n") - curLine = "" - } else { - curLine += curChar - } - - if curLine == "softmodem_gnb" { // It is treated as EOF - break - } - } - return out, nil -} - -func (o *O1TelnetClient) RunCommand(cmd string) (string, error) { - if err := o.openConnection(); err != nil { - return "", errors.New("Unable to open-connection :: " + err.Error()) - } - defer o.closeConnection() - - if err := o.writeToConnection(cmd); err != nil { - return "", errors.New("Unable to write-Command :: " + err.Error()) - } - - out, err := o.readFromConnection() - if err != nil { - return "", errors.New("Unable to read-Command-Output :: " + err.Error()) - } - return out, nil -} diff --git a/internal/controller/randeployment_controller.go b/internal/controller/randeployment_controller.go index 42f43ff..0fa9ffd 100644 --- a/internal/controller/randeployment_controller.go +++ b/internal/controller/randeployment_controller.go @@ -31,11 +31,8 @@ import ( ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - "sigs.k8s.io/controller-runtime/pkg/handler" "sigs.k8s.io/controller-runtime/pkg/log" - actorConfigv1 "actor/api/v1" - configref "github.com/nephio-project/api/references/v1alpha1" workloadv1alpha1 "github.com/nephio-project/api/workload/v1alpha1" ) @@ -225,73 +222,6 @@ func (r *RANDeploymentReconciler) GetConfigs(ctx context.Context, ranDeployment return configInfo, nil } -func (r *RANDeploymentReconciler) OwnNfConfig(ctx context.Context, ranDeployment *workloadv1alpha1.NFDeployment) error { - namespacedName := types.NamespacedName{Namespace: ranDeployment.Namespace, Name: ranDeployment.Name} - logger := log.FromContext(ctx).WithValues("RANDeployment", namespacedName) - - configsList := ranDeployment.Spec.ParametersRefs - for _, configItem := range configsList { - // Only check for NF-Config - if configItem.APIVersion == "workload.nephio.org/v1alpha1" { - configInstance := &workloadv1alpha1.NFConfig{} - if err := r.Get(ctx, types.NamespacedName{Name: *configItem.Name, Namespace: ranDeployment.Namespace}, configInstance); err != nil { - logger.Error(err, "Config for Self get error") - return err - } - logger.Info("Config for Self:", "configInstance.Name", configInstance.Name) - // Own the kind: NfConfig - if err := controllerutil.SetControllerReference(ranDeployment, configInstance, r.Scheme); err != nil { - return err - } - if err := r.Update(ctx, configInstance); err != nil { - logger.Error(err, "Unable to update NfConfig with OwnerReference | ") - return err - } - - break - } - } - - return nil -} - -func (r *RANDeploymentReconciler) checkAction(ctx context.Context, namespacedName types.NamespacedName) error { - logger := log.FromContext(ctx).WithValues("RANDeployment", namespacedName) - logger.Info("Checking ActionConfig for || " + namespacedName.String()) - // Step-1: If namespacedName refers to a ActionConfig Cr - actorConfigInstance := &actorConfigv1.ActorConfig{} - err := r.Get(ctx, namespacedName, actorConfigInstance) - if err != nil { - return err - } - logger.Info("Confirmed ActionConfig for " + namespacedName.String()) - - // Step-2: Once Confirmed the namespacedName refers to a ActionConfig Cr, Check if Action is required - actionType := actorConfigInstance.Spec.Action - target := actorConfigInstance.Spec.Target - - if actionType == "" { - return nil - } - - logger.Info("Recieved Action Request of Type : " + actionType + "\t And Target : " + target.Name) - if actionType == "bw-reconfigure" { - - o1Obj := O1TelnetClient{ - url: "oai-gnb-du-o1-telnet." + target.Namespace + ".svc.cluster.local", - port: "9090", - conn: nil, - } - err := ReconfigureBandWidth(&o1Obj, target.Value) - if err != nil { - logger.Info("Error in Reconfiguring BW :: " + err.Error()) - } - logger.Info("Bandwidth Reconfigured Successfully") - } - - return nil -} - //+kubebuilder:rbac:groups=workload.nephio.org,resources=randeployments,verbs=get;list;watch;create;update;patch;delete //+kubebuilder:rbac:groups=workload.nephio.org,resources=randeployments/status,verbs=get;update;patch //+kubebuilder:rbac:groups=workload.nephio.org,resources=randeployments/finalizers,verbs=update @@ -307,20 +237,16 @@ func (r *RANDeploymentReconciler) checkAction(ctx context.Context, namespacedNam // - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.15.0/pkg/reconcile func (r *RANDeploymentReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { logger := log.FromContext(ctx).WithValues("RANDeployment", req.NamespacedName) - // logger.Info("Overridden Values Done:: Reconcile for RANDeployment") - fmt.Println("Reconciler for namespacedName :: ", req.NamespacedName, " \n:: ", req.String()) + logger.Info("Reconcile for RANDeployment") + instance := &workloadv1alpha1.NFDeployment{} err := r.Get(ctx, req.NamespacedName, instance) if err != nil { if errors.IsNotFound(err) { - // Either the resource is deleted or Watch has called the reconcile - err = r.checkAction(ctx, req.NamespacedName) - if err != nil { - logger.Info("RANDeployment resource not found, ignoring because object must be deleted") - } - + logger.Info("RANDeployment resource not found, ignoring because object must be deleted") return ctrl.Result{}, nil } + logger.Error(err, "Failed to get RANDeployment") return ctrl.Result{}, err } @@ -412,10 +338,5 @@ func (r *RANDeploymentReconciler) Reconcile(ctx context.Context, req ctrl.Reques func (r *RANDeploymentReconciler) SetupWithManager(mgr ctrl.Manager) error { return ctrl.NewControllerManagedBy(mgr). For(&workloadv1alpha1.NFDeployment{}). - Watches(&actorConfigv1.ActorConfig{}, &handler.EnqueueRequestForObject{}). Complete(r) } - -// Watches( -// &source.Kind{Type: &actorConfigv1.ActorConfig{}}, -// &handler.EnqueueRequestForObject{}). From f297b1258dd84569648110cfb023fcf1be988eeb Mon Sep 17 00:00:00 2001 From: Ashish Jain Date: Fri, 28 Jun 2024 01:00:51 +0530 Subject: [PATCH 08/11] Adding LoadBalancer for o1-telnet --- Dockerfile | 2 +- internal/controller/resources_du.go | 24 +++++++++++++++--------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/Dockerfile b/Dockerfile index 19f248f..55d97c4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # Build the manager binary -FROM golang:1.20 as builder +FROM golang:1.20 AS builder ARG TARGETOS ARG TARGETARCH diff --git a/internal/controller/resources_du.go b/internal/controller/resources_du.go index b1bfa8d..8b92325 100644 --- a/internal/controller/resources_du.go +++ b/internal/controller/resources_du.go @@ -24,6 +24,7 @@ import ( workloadv1alpha1 "github.com/nephio-project/api/workload/v1alpha1" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" + resourcev1 "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/utils/pointer" @@ -180,8 +181,6 @@ func (resource DuResources) GetDeployment(log logr.Logger, ranDeployment *worklo corev1.EnvVar{ Name: "USE_ADDITIONAL_OPTIONS", Value: "--sa --rfsim --log_config.global_log_options level,nocolor,time" + - // " --MACRLCs.[0].local_n_address 192.168.73.3" + - // " --MACRLCs.[0].remote_n_address 192.168.72.2" + " --telnetsrv --telnetsrv.shrmod o1 --telnetsrv.listenaddr 192.168.74.2", }, corev1.EnvVar{ @@ -190,9 +189,6 @@ func (resource DuResources) GetDeployment(log logr.Logger, ranDeployment *worklo }, }, Image: paramsOAI.Spec.Image, - // Image: "arorasagar/testing-images:oai-gnb-telnet", - // Image: "nginx:latest", - // Command: []string{"tail", "-f", "dev/null"}, Ports: []corev1.ContainerPort{ corev1.ContainerPort{ @@ -206,6 +202,16 @@ func (resource DuResources) GetDeployment(log logr.Logger, ranDeployment *worklo Protocol: corev1.Protocol("UDP"), }, }, + Resources: corev1.ResourceRequirements{ + Limits: corev1.ResourceList{ + corev1.ResourceCPU: resourcev1.MustParse("2000m"), + corev1.ResourceMemory: resourcev1.MustParse("2Gi"), + }, + Requests: corev1.ResourceList{ + corev1.ResourceCPU: resourcev1.MustParse("2000m"), + corev1.ResourceMemory: resourcev1.MustParse("1Gi"), + }, + }, Stdin: false, TTY: false, VolumeMounts: []corev1.VolumeMount{ @@ -313,20 +319,20 @@ func (resource DuResources) GetService() []*corev1.Service { }, ObjectMeta: metav1.ObjectMeta{ Labels: map[string]string{ - "app.kubernetes.io/name": "oai-gnb-du-o1-telnet", + "app.kubernetes.io/name": "oai-gnb-du-o1-telnet-lb", }, - Name: "oai-gnb-du-o1-telnet", + Name: "oai-gnb-du-o1-telnet-lb", }, Spec: corev1.ServiceSpec{ Selector: map[string]string{ "app.kubernetes.io/name": "oai-gnb-du", }, - Type: corev1.ServiceType("ClusterIP"), - ClusterIP: "None", + Type: corev1.ServiceType("LoadBalancer"), Ports: []corev1.ServicePort{ corev1.ServicePort{ Port: 9090, Protocol: corev1.Protocol("TCP"), + NodePort: 32500, TargetPort: intstr.IntOrString{ IntVal: 9090, }, From d81acb611e788692c6edade98f3f0ebace1b1661 Mon Sep 17 00:00:00 2001 From: Ashish Jain Date: Fri, 28 Jun 2024 03:16:45 +0530 Subject: [PATCH 09/11] Scripts and yamls for setting-up test env --- test-infra/local-bp/create-bp-package.sh | 29 +++++++ test-infra/local-bp/deployment.yaml | 34 ++++++++ .../packageVariants/002-operators.yaml | 79 +++++++++++++++++++ .../packageVariants/004-ran-network.yaml | 61 ++++++++++++++ test-infra/oai-ue/20Mhz/configmap.yaml | 20 +++++ test-infra/oai-ue/20Mhz/sa.yaml | 7 ++ test-infra/oai-ue/20Mhz/uedeployment.yaml | 49 ++++++++++++ test-infra/oai-ue/40Mhz/configmap.yaml | 20 +++++ test-infra/oai-ue/40Mhz/sa.yaml | 7 ++ test-infra/oai-ue/40Mhz/uedeployment.yaml | 49 ++++++++++++ test-infra/oai-ue/namespace.yaml | 10 +++ 11 files changed, 365 insertions(+) create mode 100644 test-infra/local-bp/create-bp-package.sh create mode 100644 test-infra/local-bp/deployment.yaml create mode 100644 test-infra/local-bp/packageVariants/002-operators.yaml create mode 100644 test-infra/local-bp/packageVariants/004-ran-network.yaml create mode 100644 test-infra/oai-ue/20Mhz/configmap.yaml create mode 100644 test-infra/oai-ue/20Mhz/sa.yaml create mode 100644 test-infra/oai-ue/20Mhz/uedeployment.yaml create mode 100644 test-infra/oai-ue/40Mhz/configmap.yaml create mode 100644 test-infra/oai-ue/40Mhz/sa.yaml create mode 100644 test-infra/oai-ue/40Mhz/uedeployment.yaml create mode 100644 test-infra/oai-ue/namespace.yaml diff --git a/test-infra/local-bp/create-bp-package.sh b/test-infra/local-bp/create-bp-package.sh new file mode 100644 index 0000000..2a31b5c --- /dev/null +++ b/test-infra/local-bp/create-bp-package.sh @@ -0,0 +1,29 @@ +REPO='oai-ran-bp' +echo "This script is only for testing" +mkdir temp +cd temp + +mkdir master +git clone https://github.com/jain-ashish-sam/catalog.git +mv catalog/workloads/oai/* master/ +rm -rf catalog +cp ../deployment.yaml master/oai-ran-operator/operator/ + +# for pkg in 'pkg-example-cucp-bp' 'pkg-example-cuup-bp' 'pkg-example-du-bp'; +for pkg in 'oai-ran-operator' 'pkg-example-cucp-bp' 'pkg-example-cuup-bp' 'pkg-example-du-bp'; +do + CREATED_PKG=$(kpt alpha rpkg init --repository=$REPO $pkg --workspace=v1 -ndefault| awk '{print $1;}') + kpt alpha rpkg pull $CREATED_PKG ./yourpkg -ndefault + cp -r master/$pkg/* yourpkg/ + echo "Editing Package $pkg is Done| Now Push-propose-Approve" + kpt alpha rpkg push $CREATED_PKG yourpkg -ndefault + kpt alpha rpkg propose $CREATED_PKG -ndefault + kpt alpha rpkg approve $CREATED_PKG -ndefault + rm -rf yourpkg +done + +cd .. +rm -rf temp +echo "Done| Check the content of your blueprint-repo once" + + diff --git a/test-infra/local-bp/deployment.yaml b/test-infra/local-bp/deployment.yaml new file mode 100644 index 0000000..f863527 --- /dev/null +++ b/test-infra/local-bp/deployment.yaml @@ -0,0 +1,34 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + namespace: oai-ran-operators + name: oai-ran-operator +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/name: oai-ran-operator + app.kubernetes.io/component: controller + template: + metadata: + name: oai-ran-operator + labels: + app.kubernetes.io/name: oai-ran-operator + app.kubernetes.io/component: controller + spec: + serviceAccountName: oai-ran-operator + containers: + - name: operator + image: docker.io/library/local-ran-operator:v0.1 + resources: + limits: + cpu: 500m + memory: 128Mi + requests: + cpu: 10m + memory: 64Mi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL diff --git a/test-infra/local-bp/packageVariants/002-operators.yaml b/test-infra/local-bp/packageVariants/002-operators.yaml new file mode 100644 index 0000000..bd02d5f --- /dev/null +++ b/test-infra/local-bp/packageVariants/002-operators.yaml @@ -0,0 +1,79 @@ +--- +# SPDX-license-identifier: Apache-2.0 +############################################################################## +# Copyright (c) 2023 The Nephio Authors. +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +apiVersion: config.porch.kpt.dev/v1alpha1 +kind: PackageVariant +metadata: + name: oai-cp-operators +spec: + upstream: + repo: oai-core-packages + package: oai-cp-operators + revision: r2 + downstream: + repo: core + package: oai-cp-operators + annotations: + approval.nephio.org/policy: initial + injectors: + - name: core +--- +apiVersion: config.porch.kpt.dev/v1alpha1 +kind: PackageVariant +metadata: + name: oai-up-operators +spec: + upstream: + repo: oai-core-packages + package: oai-up-operators + revision: r2 + downstream: + repo: edge + package: oai-up-operators + annotations: + approval.nephio.org/policy: initial + injectors: + - name: edge + +--- +apiVersion: config.porch.kpt.dev/v1alpha1 +kind: PackageVariant +metadata: + name: oai-ran-operator-edge +spec: + upstream: + repo: oai-ran-bp + package: oai-ran-operator + revision: v1 + downstream: + repo: edge + package: oai-ran-operator + annotations: + approval.nephio.org/policy: initial + injectors: + - name: edge + +--- +apiVersion: config.porch.kpt.dev/v1alpha1 +kind: PackageVariant +metadata: + name: oai-ran-operator-regional +spec: + upstream: + repo: oai-ran-bp + package: oai-ran-operator + revision: v1 + downstream: + repo: regional + package: oai-ran-operator + annotations: + approval.nephio.org/policy: initial + injectors: + - name: regional diff --git a/test-infra/local-bp/packageVariants/004-ran-network.yaml b/test-infra/local-bp/packageVariants/004-ran-network.yaml new file mode 100644 index 0000000..a54a06c --- /dev/null +++ b/test-infra/local-bp/packageVariants/004-ran-network.yaml @@ -0,0 +1,61 @@ +--- +# SPDX-license-identifier: Apache-2.0 +############################################################################## +# Copyright (c) 2024 The Nephio Authors. +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +apiVersion: config.porch.kpt.dev/v1alpha1 +kind: PackageVariant +metadata: + name: oai-cucp +spec: + upstream: + repo: oai-ran-bp + package: pkg-example-cucp-bp + revision: v1 + downstream: + repo: regional + package: oai-ran-cucp + annotations: + approval.nephio.org/policy: initial + injectors: + - name: regional +--- +apiVersion: config.porch.kpt.dev/v1alpha1 +kind: PackageVariant +metadata: + name: oai-du +spec: + upstream: + repo: oai-ran-bp + package: pkg-example-du-bp + revision: v1 + downstream: + repo: edge + package: oai-ran-du + annotations: + approval.nephio.org/policy: initial + injectors: + - name: edge +--- +apiVersion: config.porch.kpt.dev/v1alpha1 +kind: PackageVariant +metadata: + name: oai-cuup +spec: + upstream: + repo: oai-ran-bp + package: pkg-example-cuup-bp + revision: v1 + downstream: + repo: edge + package: oai-ran-cuup + annotations: + approval.nephio.org/policy: initial + injectors: + - name: edge + diff --git a/test-infra/oai-ue/20Mhz/configmap.yaml b/test-infra/oai-ue/20Mhz/configmap.yaml new file mode 100644 index 0000000..c6b85c9 --- /dev/null +++ b/test-infra/oai-ue/20Mhz/configmap.yaml @@ -0,0 +1,20 @@ +apiVersion: v1 +kind: ConfigMap +metadata: # kpt-merge: oai-ue/oai-nr-ue-configmap + name: oai-nr-ue-configmap + namespace: oai-ue + annotations: + internal.kpt.dev/upstream-identifier: '|ConfigMap|oai-ue|oai-nr-ue-configmap' +data: + nr-ue.conf: | + uicc0 = { + imsi = "001010000000100"; + key = "fec86ba6eb707ed08905757b1bb44b8f"; + opc= "C42449363BBAD02B66D16BC975D77CC1"; + dnn= "internet"; + nssai_sst=1; + nssai_sd=16777215; + } + + + \ No newline at end of file diff --git a/test-infra/oai-ue/20Mhz/sa.yaml b/test-infra/oai-ue/20Mhz/sa.yaml new file mode 100644 index 0000000..333a9a3 --- /dev/null +++ b/test-infra/oai-ue/20Mhz/sa.yaml @@ -0,0 +1,7 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: # kpt-merge: oai-ue/oai-nr-ue-sa + name: oai-nr-ue-sa + namespace: oai-ue + annotations: + internal.kpt.dev/upstream-identifier: '|ServiceAccount|oai-ue|oai-nr-ue-sa' diff --git a/test-infra/oai-ue/20Mhz/uedeployment.yaml b/test-infra/oai-ue/20Mhz/uedeployment.yaml new file mode 100644 index 0000000..20718d3 --- /dev/null +++ b/test-infra/oai-ue/20Mhz/uedeployment.yaml @@ -0,0 +1,49 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: # kpt-merge: oai-ue/oai-nr-ue + name: oai-nr-ue + namespace: oai-ue + annotations: + internal.kpt.dev/upstream-identifier: 'apps|Deployment|oai-ue|oai-nr-ue' +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/name: oai-nr-ue + app.kubernetes.io/instance: nrue + strategy: + type: Recreate + template: + metadata: + labels: + app.kubernetes.io/name: oai-nr-ue + app.kubernetes.io/instance: nrue + app: oai-nr-ue + spec: + securityContext: + runAsGroup: 0 + runAsUser: 0 + imagePullSecrets: + - name: regcred + containers: + - name: nr-ue + image: "oaisoftwarealliance/oai-nr-ue:v2.1.0" + securityContext: + privileged: true + env: + - name: USE_ADDITIONAL_OPTIONS + # oai-gnb-du.oai-ran-du + value: "--sa --rfsim --rfsimulator.serveraddr 192.168.1.21 --log_config.global_log_options level,nocolor,time -r 51 --numerology 1 -C 3450720000 --ssb 186 --uicc0.imsi 001010000000100" + volumeMounts: + - mountPath: /opt/oai-nr-ue/etc/nr-ue.conf + name: configuration + subPath: nr-ue.conf + dnsPolicy: ClusterFirst + restartPolicy: Always + serviceAccountName: oai-nr-ue-sa + terminationGracePeriodSeconds: 5 + volumes: + - configMap: + defaultMode: 420 + name: oai-nr-ue-configmap + name: configuration diff --git a/test-infra/oai-ue/40Mhz/configmap.yaml b/test-infra/oai-ue/40Mhz/configmap.yaml new file mode 100644 index 0000000..c6b85c9 --- /dev/null +++ b/test-infra/oai-ue/40Mhz/configmap.yaml @@ -0,0 +1,20 @@ +apiVersion: v1 +kind: ConfigMap +metadata: # kpt-merge: oai-ue/oai-nr-ue-configmap + name: oai-nr-ue-configmap + namespace: oai-ue + annotations: + internal.kpt.dev/upstream-identifier: '|ConfigMap|oai-ue|oai-nr-ue-configmap' +data: + nr-ue.conf: | + uicc0 = { + imsi = "001010000000100"; + key = "fec86ba6eb707ed08905757b1bb44b8f"; + opc= "C42449363BBAD02B66D16BC975D77CC1"; + dnn= "internet"; + nssai_sst=1; + nssai_sd=16777215; + } + + + \ No newline at end of file diff --git a/test-infra/oai-ue/40Mhz/sa.yaml b/test-infra/oai-ue/40Mhz/sa.yaml new file mode 100644 index 0000000..333a9a3 --- /dev/null +++ b/test-infra/oai-ue/40Mhz/sa.yaml @@ -0,0 +1,7 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: # kpt-merge: oai-ue/oai-nr-ue-sa + name: oai-nr-ue-sa + namespace: oai-ue + annotations: + internal.kpt.dev/upstream-identifier: '|ServiceAccount|oai-ue|oai-nr-ue-sa' diff --git a/test-infra/oai-ue/40Mhz/uedeployment.yaml b/test-infra/oai-ue/40Mhz/uedeployment.yaml new file mode 100644 index 0000000..09f2522 --- /dev/null +++ b/test-infra/oai-ue/40Mhz/uedeployment.yaml @@ -0,0 +1,49 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: # kpt-merge: oai-ue/oai-nr-ue + name: oai-nr-ue + namespace: oai-ue + annotations: + internal.kpt.dev/upstream-identifier: 'apps|Deployment|oai-ue|oai-nr-ue' +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/name: oai-nr-ue + app.kubernetes.io/instance: nrue + strategy: + type: Recreate + template: + metadata: + labels: + app.kubernetes.io/name: oai-nr-ue + app.kubernetes.io/instance: nrue + app: oai-nr-ue + spec: + securityContext: + runAsGroup: 0 + runAsUser: 0 + imagePullSecrets: + - name: regcred + containers: + - name: nr-ue + image: "oaisoftwarealliance/oai-nr-ue:v2.1.0" + securityContext: + privileged: true + env: + - name: USE_ADDITIONAL_OPTIONS + # oai-gnb-du.oai-ran-du + value: "--sa -E --rfsimulator.serveraddr 192.168.1.21 --rfsim --log_config.global_log_options level,nocolor,time -r 106 --numerology 1 -C 3619200000 --uicc0.imsi 001010000000100 " + volumeMounts: + - mountPath: /opt/oai-nr-ue/etc/nr-ue.conf + name: configuration + subPath: nr-ue.conf + dnsPolicy: ClusterFirst + restartPolicy: Always + serviceAccountName: oai-nr-ue-sa + terminationGracePeriodSeconds: 5 + volumes: + - configMap: + defaultMode: 420 + name: oai-nr-ue-configmap + name: configuration diff --git a/test-infra/oai-ue/namespace.yaml b/test-infra/oai-ue/namespace.yaml new file mode 100644 index 0000000..d478d5a --- /dev/null +++ b/test-infra/oai-ue/namespace.yaml @@ -0,0 +1,10 @@ +apiVersion: v1 +kind: Namespace +metadata: # kpt-merge: /oai-ue + name: oai-ue + labels: + pod-security.kubernetes.io/warn: "privileged" + pod-security.kubernetes.io/audit: "privileged" + pod-security.kubernetes.io/enforce: "privileged" + annotations: + internal.kpt.dev/upstream-identifier: '|Namespace|default|oai-ue' From 6d4fd38af267438381eab342197400dda8b68a55 Mon Sep 17 00:00:00 2001 From: jain-ashish-sam <145763342+jain-ashish-sam@users.noreply.github.com> Date: Fri, 28 Jun 2024 03:21:58 +0530 Subject: [PATCH 10/11] ReadMe.md For setting up test-env --- test-infra/ReadMe.md | 84 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 test-infra/ReadMe.md diff --git a/test-infra/ReadMe.md b/test-infra/ReadMe.md new file mode 100644 index 0000000..51790aa --- /dev/null +++ b/test-infra/ReadMe.md @@ -0,0 +1,84 @@ +# Local Testing Environment for OAI with O1-Telnet +Follow the [Installation Guide](https://docs.nephio.org/docs/guides/install-guides/) to install Nephio + +Now, we need to follow the [following exercise](https://docs.nephio.org/docs/guides/user-guides/exercise-2-oai/) which we term as Master Excerises. + +### Step-1: Setting up infrastructure +Follow the steps 1 and 2 of [Master Excercise](https://docs.nephio.org/docs/guides/user-guides/exercise-2-oai/) + +### Step-2: Creating a Local operator-image and pushing it to Edge and Regional Cluster: +``` bash +# Clone the Repo +cd oai/ +docker build . -t local-ran-operator:v0.1 +kind load docker-image local-ran-operator:v0.1 -n edge +kind load docker-image local-ran-operator:v0.1 -n regional +``` + +### Step-3. Setting up Local Blueprint Repo: + 1. Create a new Repo at the Gitea-Cluster (172.18.0.200:3000) (Repo-name: 'oai-ran-bp' is recommended) + 2. Register the Repo to KPT + ``` bash + kpt alpha repo register \ + --namespace default \ + --repo-basic-username= \ + --repo-basic-password= \ + + ``` + 3. Create and push blueprints to local as per the [PR](https://github.com/nephio-project/catalog/pull/41) + ```bash + cd test-infra/local-bp/ + ./create-bp-package.sh + ``` + The above script will create the following blueprint packages with updated values: 'oai-ran-operator', 'pkg-example-cucp-bp', 'pkg-example-cuup-bp', 'pkg-example-du-bp'. + Make sure to check your repo, before moving forward. + +### Step-4: Making sure your PackageVariant point to your local Bp-Repo +```bash + cd test-infra/local-bp/packageVariants/ + cp -r . $HOME/test-infra/e2e/tests/oai/ +``` +Note: If your repo-name is not 'oai-ran-bp', then update the upstream-repo of packageVariant accordingly. + +### Step-5: Deploy Core and Ran +Follow the steps 3-6 of [Master Excercise](https://docs.nephio.org/docs/guides/user-guides/exercise-2-oai/) + +### Step-6: Validate the deployment by ascessing o1-telnet +```bash + sudo apt update && sudo apt install netcat + O1_IP=$(kubectl get svc oai-gnb-du-o1-telnet-lb -n oai-ran-du --context edge-admin@edge -o=jsonpath='{.status.loadBalancer.ingress[0].ip}') + echo o1 stats | nc -N $O1_IP 9090 +``` + +### Step-7: Deploy UE (20 MHz): +The current ue-image is not able to connect to the du using service (oai-gnb-du.oai-ran-du), Therefore, we provide the du-ip to ue manually as workaround: (Todo: Ideal way to resolve) +```bash +DU_POD=$(kubectl get pods -n oai-ran-du --context edge-admin@edge -l app.kubernetes.io/name=oai-gnb-du -o jsonpath='{.items[*].metadata.name}') +DU_IP=$(kubectl get pods $DU_POD -n oai-ran-du --context edge-admin@edge -o jsonpath="{.status.podIP}") +echo $DU_IP +``` +Copy the du-ip to the "uedeployment.yaml" under the Additional-Option "--rfsimulator.serveraddr" to both 20Mhz and 40Mhz UE. + +#### Deploy the ue +```bash +cd test-infra/oai-ue/ +kubectl apply -f namespace.yaml --context edge-admin@edge +kubectl apply -f 20Mhz/. --context edge-admin@edge +``` + +#### Run the Ping Test +```bash +UE_POD=$(kubectl get pods -n oai-ue --context edge-admin@edge -l app.kubernetes.io/name=oai-nr-ue -o jsonpath='{.items[*].metadata.name}') +UPF_POD=$(kubectl get pods -n oai-core --context=edge-admin@edge -l workload.nephio.org/oai=upf -o jsonpath='{.items[*].metadata.name}') +UPF_tun0_IP_ADDR=$(kubectl exec -it $UPF_POD -n oai-core -c upf-edge --context edge-admin@edge -- ip -f inet addr show tun0 | sed -En -e 's/.*inet ([0-9.]+).*/\1/p') +kubectl exec -it $UE_POD -n oai-ue --context edge-admin@edge -- ping -c 3 $UPF_tun0_IP_ADDR +``` +### Step-8: Bandwidth Reconfigure Procedure (20 Mhz to 40 Mhz) using o1-telnet +```bash +O1_IP=$(kubectl get svc oai-gnb-du-o1-telnet-lb -n oai-ran-du --context edge-admin@edge -o=jsonpath='{.status.loadBalancer.ingress[0].ip}') +echo o1 stop_modem | nc -N $O1_IP 9090 +echo o1 bwconfig 40 | nc -N $O1_IP 9090 +echo o1 start_modem | nc -N $O1_IP 9090 +echo o1 stats | nc -N $O1_IP 9090 +``` +After Reconfiguration, Connect the 40 Mhz ue using Step-7 and validate the Bandwidth-reconfiguration using Ping-Test From 0b8d5945c910568e14c9c82f4bd2ca9f57d336dc Mon Sep 17 00:00:00 2001 From: Ashish Jain Date: Fri, 28 Jun 2024 03:49:54 +0530 Subject: [PATCH 11/11] Cleaning the Code --- .../controller/randeployment_controller.go | 4 - internal/controller/resources_cucp.go | 3 - internal/controller/resources_cucp_test.go | 4 +- internal/controller/resources_cuup.go | 9 +- internal/controller/resources_cuup_test.go | 4 +- internal/controller/resources_du.go | 4 - internal/controller/resources_du_test.go | 4 +- internal/controller/templates.go | 570 ------------------ 8 files changed, 7 insertions(+), 595 deletions(-) diff --git a/internal/controller/randeployment_controller.go b/internal/controller/randeployment_controller.go index 0fa9ffd..54d2b92 100644 --- a/internal/controller/randeployment_controller.go +++ b/internal/controller/randeployment_controller.go @@ -285,10 +285,6 @@ func (r *RANDeploymentReconciler) Reconcile(ctx context.Context, req ctrl.Reques logger.Info("--- Creation for DU") duResource := DuResources{} r.CreateAll(ctx, instance, duResource, configInfo) - // Add a NfConfig Listeners (Own) - // if err := r.OwnNfConfig(ctx, instance); err != nil { - // logger.Error(err, " | While Setting OwnerReference") - // } logger.Info("--- DU Created") } diff --git a/internal/controller/resources_cucp.go b/internal/controller/resources_cucp.go index bbbf883..866ce3a 100644 --- a/internal/controller/resources_cucp.go +++ b/internal/controller/resources_cucp.go @@ -218,8 +218,6 @@ func (resource CuCpResources) GetDeployment(log logr.Logger, ranDeployment *work corev1.EnvVar{ Name: "USE_ADDITIONAL_OPTIONS", Value: "--sa --log_config.global_log_options level,nocolor,time", - // " --gNBs.[0].E1_INTERFACE.[0].ipv4_cucp 192.168.77.2" + - // " --gNBs.[0].local_s_address 192.168.72.2", }, corev1.EnvVar{ Name: "USE_VOLUMED_CONF", @@ -227,7 +225,6 @@ func (resource CuCpResources) GetDeployment(log logr.Logger, ranDeployment *work }, }, Image: paramsOAI.Spec.Image, - // Image: "arorasagar/testing-images:oai-gnb-telnet", Ports: []corev1.ContainerPort{ corev1.ContainerPort{ diff --git a/internal/controller/resources_cucp_test.go b/internal/controller/resources_cucp_test.go index e569a79..9c11bbd 100644 --- a/internal/controller/resources_cucp_test.go +++ b/internal/controller/resources_cucp_test.go @@ -589,8 +589,8 @@ func TestGetConfigMapCuCp(t *testing.T) { NSSAI_SD: *tc.paramsPlmn.Spec.PLMNInfo[0].NSSAI[0].SD, }) - if !reflect.DeepEqual(got[0].Data["mounted.conf"], defaultWantConfigurations) { - t.Errorf("GetConfigMap returned %s Wanted %s", got[0].Data["mounted.conf"], defaultWantConfigurations) + if !reflect.DeepEqual(got[0].Data["gnb.conf"], defaultWantConfigurations) { + t.Errorf("GetConfigMap returned %s Wanted %s", got[0].Data["gnb.conf"], defaultWantConfigurations) } } else { if got != nil { diff --git a/internal/controller/resources_cuup.go b/internal/controller/resources_cuup.go index 33a607b..132c458 100644 --- a/internal/controller/resources_cuup.go +++ b/internal/controller/resources_cuup.go @@ -112,10 +112,6 @@ func (resource CuUpResources) GetDeployment(log logr.Logger, ranDeployment *work corev1.EnvVar{ Name: "USE_ADDITIONAL_OPTIONS", Value: "--sa --log_config.global_log_options level,nocolor,time", - // " --gNBs.[0].E1_INTERFACE.[0].ipv4_cucp 192.168.77.2" + - // " --gNBs.[0].E1_INTERFACE.[0].ipv4_cuup 192.168.77.3" + - // " --gNBs.[0].local_s_address 192.168.73.2" + - // " --gNBs.[0].remote_s_address 127.0.0.1", }, corev1.EnvVar{ Name: "USE_VOLUMED_CONF", @@ -147,10 +143,7 @@ func (resource CuUpResources) GetDeployment(log logr.Logger, ranDeployment *work StdinOnce: false, TTY: false, Image: paramsOAI.Spec.Image, - // Image: "oaisoftwarealliance/oai-nr-cuup:v2.1.0", - // Image: "nginx:latest", - // Command: []string{"tail", "-f", "dev/null"}, - Name: "gnbcuup", + Name: "gnbcuup", }, }, DNSPolicy: corev1.DNSPolicy("ClusterFirst"), diff --git a/internal/controller/resources_cuup_test.go b/internal/controller/resources_cuup_test.go index 7e36fdd..cfd62fe 100644 --- a/internal/controller/resources_cuup_test.go +++ b/internal/controller/resources_cuup_test.go @@ -510,8 +510,8 @@ func TestGetConfigMapCuUp(t *testing.T) { t.Errorf("GetConfigMap CuUp returned %v Wanted nil", got) } } else { - if got[0].Data["mounted.conf"] != tc.wantedConfiguration { - t.Errorf("GetConfigMap CuUp returned %v Wanted %v", got[0].Data["mounted.conf"], tc.wantedConfiguration) + if got[0].Data["gnb.conf"] != tc.wantedConfiguration { + t.Errorf("GetConfigMap CuUp returned %v Wanted %v", got[0].Data["gnb.conf"], tc.wantedConfiguration) } } diff --git a/internal/controller/resources_du.go b/internal/controller/resources_du.go index 8b92325..5198eda 100644 --- a/internal/controller/resources_du.go +++ b/internal/controller/resources_du.go @@ -183,10 +183,6 @@ func (resource DuResources) GetDeployment(log logr.Logger, ranDeployment *worklo Value: "--sa --rfsim --log_config.global_log_options level,nocolor,time" + " --telnetsrv --telnetsrv.shrmod o1 --telnetsrv.listenaddr 192.168.74.2", }, - corev1.EnvVar{ - Name: "ASAN_OPTIONS", - Value: "detect_leaks=0", - }, }, Image: paramsOAI.Spec.Image, Ports: []corev1.ContainerPort{ diff --git a/internal/controller/resources_du_test.go b/internal/controller/resources_du_test.go index c6464c1..390711c 100644 --- a/internal/controller/resources_du_test.go +++ b/internal/controller/resources_du_test.go @@ -351,8 +351,8 @@ func TestGetConfigMapDu(t *testing.T) { NSSAI_SD: *tc.paramsPlmn.Spec.PLMNInfo[0].NSSAI[0].SD, }) - if !reflect.DeepEqual(got[0].Data["mounted.conf"], defaultWantConfigurations) { - t.Errorf("GetConfigMap returned %s Wanted %s", got[0].Data["mounted.conf"], defaultWantConfigurations) + if !reflect.DeepEqual(got[0].Data["gnb.conf"], defaultWantConfigurations) { + t.Errorf("GetConfigMap returned %s Wanted %s", got[0].Data["gnb.conf"], defaultWantConfigurations) } } else { if got != nil { diff --git a/internal/controller/templates.go b/internal/controller/templates.go index 0d2e533..791d321 100644 --- a/internal/controller/templates.go +++ b/internal/controller/templates.go @@ -21,577 +21,7 @@ import ( "text/template" ) -const configurationTemplateSourceForCuCp = ` -Active_gNBs = ( "oai-cu-cp"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; -Num_Threads_PUSCH = 8; -sa = 1; - -gNBs = -( - { - ////////// Identification parameters: - gNB_CU_ID = 0xe00; - -# cell_type = "CELL_MACRO_GNB"; - - gNB_name = "oai-cu-cp"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = {{ .TAC }}; - plmn_list = ({ mcc = {{ .PLMN_MCC }}; - mnc = {{ .PLMN_MNC }}; - mnc_length ={{ .PLMN_MNC_LENGTH }}; - snssaiList = ({ sst = {{ .NSSAI_SST }}, sd = 0x{{ .NSSAI_SD }} }) - }); - - - nr_cellid = {{ .CELL_ID }}; - force_256qam_off = 1; - - tr_s_preference = "f1"; - - local_s_if_name = "f1c"; - local_s_address = {{ .F1C_IP }}; - remote_s_address = "0.0.0.0"; - local_s_portc = 501; - local_s_portd = 2152; - remote_s_portc = 500; - remote_s_portd = 2152; - - ssb_SubcarrierOffset = 0; - min_rxtxtime = 6; - - servingCellConfigCommon = ( - { - #spCellConfigCommon - - physCellId = {{ .PHY_CELL_ID }}; - -# downlinkConfigCommon - #frequencyInfoDL - # this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP) - absoluteFrequencySSB = 641280; - dl_frequencyBand = {{ .DL_FREQ_BAND }}; - # this is 3600 MHz - dl_absoluteFrequencyPointA = 640008; - #scs-SpecificCarrierList - dl_offstToCarrier = 0; -# subcarrierSpacing -# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 - dl_subcarrierSpacing = {{ .DL_SCS }}; - dl_carrierBandwidth = {{ .DL_CARRIER_BW }}; - #initialDownlinkBWP - #genericParameters - # this is RBstart=27,L=48 (275*(L-1))+RBstart - initialDLBWPlocationAndBandwidth = 28875; # 6366 12925 12956 28875 12952 -# subcarrierSpacing -# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 - initialDLBWPsubcarrierSpacing = 1; - #pdcch-ConfigCommon - initialDLBWPcontrolResourceSetZero = 11; - initialDLBWPsearchSpaceZero = 0; - - #uplinkConfigCommon - #frequencyInfoUL - ul_frequencyBand = {{ .UL_FREQ_BAND }}; - #scs-SpecificCarrierList - ul_offstToCarrier = 0; -# subcarrierSpacing -# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 - ul_subcarrierSpacing = {{ .UL_SCS }}; - ul_carrierBandwidth = {{ .UL_CARRIER_BW }}; - pMax = 20; - #initialUplinkBWP - #genericParameters - initialULBWPlocationAndBandwidth = 28875; -# subcarrierSpacing -# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 - initialULBWPsubcarrierSpacing = 1; - #rach-ConfigCommon - #rach-ConfigGeneric - prach_ConfigurationIndex = 98; -#prach_msg1_FDM -#0 = one, 1=two, 2=four, 3=eight - prach_msg1_FDM = 0; - prach_msg1_FrequencyStart = 0; - zeroCorrelationZoneConfig = 13; - preambleReceivedTargetPower = -96; -#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) - preambleTransMax = 6; -#powerRampingStep -# 0=dB0,1=dB2,2=dB4,3=dB6 - powerRampingStep = 1; -#ra_ReponseWindow -#1,2,4,8,10,20,40,80 - ra_ResponseWindow = 4; -#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR -#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen - ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4; -#oneHalf (0..15) 4,8,12,16,...60,64 - ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 14; -#ra_ContentionResolutionTimer -#(0..7) 8,16,24,32,40,48,56,64 - ra_ContentionResolutionTimer = 7; - rsrp_ThresholdSSB = 19; -#prach-RootSequenceIndex_PR -#1 = 839, 2 = 139 - prach_RootSequenceIndex_PR = 2; - prach_RootSequenceIndex = 1; - # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex - # - msg1_SubcarrierSpacing = 1, -# restrictedSetConfig -# 0=unrestricted, 1=restricted type A, 2=restricted type B - restrictedSetConfig = 0, - - msg3_DeltaPreamble = 1; - p0_NominalWithGrant =-90; - -# pucch-ConfigCommon setup : -# pucchGroupHopping -# 0 = neither, 1= group hopping, 2=sequence hopping - pucchGroupHopping = 0; - hoppingId = 40; - p0_nominal = -90; -# ssb_PositionsInBurs_BitmapPR -# 1=short, 2=medium, 3=long - ssb_PositionsInBurst_PR = 2; - ssb_PositionsInBurst_Bitmap = 1; - -# ssb_periodicityServingCell -# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 - ssb_periodicityServingCell = 2; - -# dmrs_TypeA_position -# 0 = pos2, 1 = pos3 - dmrs_TypeA_Position = 0; - -# subcarrierSpacing -# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 - subcarrierSpacing = 1; - - - #tdd-UL-DL-ConfigurationCommon -# subcarrierSpacing -# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 - referenceSubcarrierSpacing = 1; - # pattern1 - # dl_UL_TransmissionPeriodicity - # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 - dl_UL_TransmissionPeriodicity = 6; - nrofDownlinkSlots = 7; - nrofDownlinkSymbols = 6; - nrofUplinkSlots = 2; - nrofUplinkSymbols = 4; - - ssPBCH_BlockPower = -25; - } - - ); - # ------- SCTP definitions - SCTP : - { - # Number of streams to use in input/output - SCTP_INSTREAMS = 2; - SCTP_OUTSTREAMS = 2; - }; - - - ////////// AMF parameters: - amf_ip_address = ( { ipv4 = {{ .AMF_IP }}; - ipv6 = "0:0:0::0"; - active = "yes"; - preference = "ipv4"; - } - ); - - E1_INTERFACE = - ( - { - type = "cp"; - ipv4_cucp = {{ .E1_IP }}; - port_cucp = 38462; - ipv4_cuup = "0.0.0.0"; - port_cuup = 38462; - } - ) - - NETWORK_INTERFACES : - { - GNB_INTERFACE_NAME_FOR_NG_AMF = "n2"; - GNB_IPV4_ADDRESS_FOR_NG_AMF = {{ .N2_IP }}; - }; - } -); - -security = { - # preferred ciphering algorithms - # the first one of the list that an UE supports in chosen - # valid values: nea0, nea1, nea2, nea3 - ciphering_algorithms = ( "nea0" ); - - # preferred integrity algorithms - # the first one of the list that an UE supports in chosen - # valid values: nia0, nia1, nia2, nia3 - integrity_algorithms = ( "nia2", "nia0" ); - - # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter - # what 'ciphering_algorithms' configures; same thing for 'drb_integrity' - drb_ciphering = "yes"; - drb_integrity = "no"; -}; - log_config : - { - global_log_level ="info"; - hw_log_level ="info"; - phy_log_level ="info"; - mac_log_level ="info"; - rlc_log_level ="debug"; - pdcp_log_level ="info"; - rrc_log_level ="info"; - f1ap_log_level ="info"; - ngap_log_level ="debug"; - }; - -` -const configurationTemplateSourceForCuUp = ` -Active_gNBs = ( "oai-cu-up"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; -sa = 1; -gNBs = -( - { - ////////// Identification parameters: - gNB_CU_ID = 0xe00; - -# cell_type = "CELL_MACRO_GNB"; - - gNB_name = "oai-cu-up"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = {{ .TAC }}; - plmn_list = ({ mcc = {{ .PLMN_MCC }}; - mnc = {{ .PLMN_MNC }}; - mnc_length ={{ .PLMN_MNC_LENGTH }}; - snssaiList = ({ sst = {{ .NSSAI_SST }}, sd = 0x{{ .NSSAI_SD }} }) - }); - - tr_s_preference = "f1"; - - local_s_if_name = "f1u"; - local_s_address = {{ .F1U_IP }}; - remote_s_address = "0.0.0.0"; - local_s_portc = 501; - local_s_portd = 2152; - remote_s_portc = 500; - remote_s_portd = 2152; - - # ------- SCTP definitions - SCTP : - { - # Number of streams to use in input/output - SCTP_INSTREAMS = 2; - SCTP_OUTSTREAMS = 2; - }; - - E1_INTERFACE = - ( - { - type = "up"; - ipv4_cucp = {{ .CUCP_E1 }}; - ipv4_cuup = {{ .E1_IP }}; - } - ) - - NETWORK_INTERFACES : - { - GNB_INTERFACE_NAME_FOR_NG_AMF = "n3"; - GNB_IPV4_ADDRESS_FOR_NG_AMF = {{ .N3_IP }}; - GNB_INTERFACE_NAME_FOR_NGU = "n3"; - GNB_IPV4_ADDRESS_FOR_NGU = {{ .N3_IP }}; - GNB_PORT_FOR_S1U = 2152; # Spec 2152 - }; - } -); - -security = { - # preferred ciphering algorithms - # the first one of the list that an UE supports in chosen - # valid values: nea0, nea1, nea2, nea3 - ciphering_algorithms = ( "nea0" ); - - # preferred integrity algorithms - # the first one of the list that an UE supports in chosen - # valid values: nia0, nia1, nia2, nia3 - integrity_algorithms = ( "nia2", "nia0" ); - - # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter - # what 'ciphering_algorithms' configures; same thing for 'drb_integrity' - drb_ciphering = "yes"; - drb_integrity = "no"; -}; - log_config : - { - global_log_level ="info"; - hw_log_level ="info"; - phy_log_level ="info"; - mac_log_level ="info"; - rlc_log_level ="debug"; - pdcp_log_level ="info"; - rrc_log_level ="info"; - f1ap_log_level ="info"; - ngap_log_level ="debug"; - }; -` -const configurationTemplateSourceForDu = ` -Active_gNBs = ( "oai-du-rfsim"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -gNBs = -( - { - ////////// Identification parameters: - gNB_ID = 0xe00; - -# cell_type = "CELL_MACRO_GNB"; - - gNB_name = "oai-du-rfsim"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = {{ .TAC }}; - plmn_list = ({ mcc = {{ .PLMN_MCC }}; mnc = {{ .PLMN_MNC }}; mnc_length = {{ .PLMN_MNC_LENGTH }}; snssaiList = ({ sst = {{ .NSSAI_SST }}, sd = 0x{{ .NSSAI_SD }} }) }); - - - nr_cellid = {{ .CELL_ID }}; - - ////////// Physical parameters: - - min_rxtxtime = 6; - force_256qam_off = 1; - - servingCellConfigCommon = ( - { - #spCellConfigCommon - - physCellId = {{ .PHY_CELL_ID }}; - -# downlinkConfigCommon - #frequencyInfoDL - # this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP) - absoluteFrequencySSB = 641280; - dl_frequencyBand = {{ .DL_FREQ_BAND }}; - # this is 3600 MHz - dl_absoluteFrequencyPointA = 640008; - #scs-SpecificCarrierList - dl_offstToCarrier = 0; -# subcarrierSpacing -# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 - dl_subcarrierSpacing = {{ .DL_SCS }}; - dl_carrierBandwidth = {{ .DL_CARRIER_BW }}; - #initialDownlinkBWP - #genericParameters - # this is RBstart=27,L=48 (275*(L-1))+RBstart - initialDLBWPlocationAndBandwidth = 28875; # 6366 12925 12956 28875 12952 -# subcarrierSpacing -# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 - initialDLBWPsubcarrierSpacing = 1; - #pdcch-ConfigCommon - initialDLBWPcontrolResourceSetZero = 12; - initialDLBWPsearchSpaceZero = 0; - - #uplinkConfigCommon - #frequencyInfoUL - ul_frequencyBand = {{ .UL_FREQ_BAND }}; - #scs-SpecificCarrierList - ul_offstToCarrier = 0; -# subcarrierSpacing -# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 - ul_subcarrierSpacing = {{ .UL_SCS }}; - ul_carrierBandwidth = {{ .UL_CARRIER_BW }}; - pMax = 20; - #initialUplinkBWP - #genericParameters - initialULBWPlocationAndBandwidth = 28875; -# subcarrierSpacing -# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 - initialULBWPsubcarrierSpacing = 1; - #rach-ConfigCommon - #rach-ConfigGeneric - prach_ConfigurationIndex = 98; -#prach_msg1_FDM -#0 = one, 1=two, 2=four, 3=eight - prach_msg1_FDM = 0; - prach_msg1_FrequencyStart = 0; - zeroCorrelationZoneConfig = 13; - preambleReceivedTargetPower = -96; -#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) - preambleTransMax = 6; -#powerRampingStep -# 0=dB0,1=dB2,2=dB4,3=dB6 - powerRampingStep = 1; -#ra_ReponseWindow -#1,2,4,8,10,20,40,80 - ra_ResponseWindow = 4; -#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR -#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen - ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4; -#oneHalf (0..15) 4,8,12,16,...60,64 - ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 14; -#ra_ContentionResolutionTimer -#(0..7) 8,16,24,32,40,48,56,64 - ra_ContentionResolutionTimer = 7; - rsrp_ThresholdSSB = 19; -#prach-RootSequenceIndex_PR -#1 = 839, 2 = 139 - prach_RootSequenceIndex_PR = 2; - prach_RootSequenceIndex = 1; - # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex - # - msg1_SubcarrierSpacing = 1, -# restrictedSetConfig -# 0=unrestricted, 1=restricted type A, 2=restricted type B - restrictedSetConfig = 0, - - msg3_DeltaPreamble = 1; - p0_NominalWithGrant =-90; - -# pucch-ConfigCommon setup : -# pucchGroupHopping -# 0 = neither, 1= group hopping, 2=sequence hopping - pucchGroupHopping = 0; - hoppingId = 40; - p0_nominal = -90; -# ssb_PositionsInBurs_BitmapPR -# 1=short, 2=medium, 3=long - ssb_PositionsInBurst_PR = 2; - ssb_PositionsInBurst_Bitmap = 1; - -# ssb_periodicityServingCell -# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 - ssb_periodicityServingCell = 2; - -# dmrs_TypeA_position -# 0 = pos2, 1 = pos3 - dmrs_TypeA_Position = 0; - -# subcarrierSpacing -# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 - subcarrierSpacing = 1; - - - #tdd-UL-DL-ConfigurationCommon -# subcarrierSpacing -# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 - referenceSubcarrierSpacing = 1; - # pattern1 - # dl_UL_TransmissionPeriodicity - # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 - dl_UL_TransmissionPeriodicity = 6; - nrofDownlinkSlots = 7; - nrofDownlinkSymbols = 6; - nrofUplinkSlots = 2; - nrofUplinkSymbols = 4; - - ssPBCH_BlockPower = -25; - } - - ); - - - # ------- SCTP definitions - SCTP : - { - # Number of streams to use in input/output - SCTP_INSTREAMS = 2; - SCTP_OUTSTREAMS = 2; - }; - } -); - -MACRLCs = ( - { - num_cc = 1; - tr_s_preference = "local_L1"; - tr_n_preference = "f1"; - local_n_if_name = "f1"; - local_n_address = {{ .F1C_DU_IP }}; - remote_n_address = {{ .F1C_CU_IP }}; - local_n_portc = 500; - local_n_portd = 2152; - remote_n_portc = 501; - remote_n_portd = 2152; - pusch_TargetSNRx10 = 200; - pucch_TargetSNRx10 = 200; - ulsch_max_frame_inactivity = 1; - } -); - -L1s = ( -{ - num_cc = 1; - tr_n_preference = "local_mac"; - prach_dtx_threshold = 200; - pucch0_dtx_threshold = 150; - ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 -} -); - -RUs = ( - { - local_rf = "yes" - nb_tx = 1 - nb_rx = 1 - att_tx = 0 - att_rx = 0; - bands = [78]; - max_pdschReferenceSignalPower = -27; - max_rxgain = 114; - eNB_instances = [0]; - #beamforming 1x4 matrix: - bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000]; - clock_src = "internal"; - } -); - -THREAD_STRUCT = ( - { - #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" - parallel_config = "PARALLEL_SINGLE_THREAD"; - #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" - worker_config = "WORKER_ENABLE"; - } -); -rfsimulator: { -serveraddr = "server"; - serverport = "4043"; - options = (); #("saviq"); or/and "chanmod" - modelname = "AWGN"; - IQfile = "/tmp/rfsimulator.iqs" -} - - log_config : - { - global_log_level ="info"; - hw_log_level ="info"; - phy_log_level ="info"; - mac_log_level ="info"; - rlc_log_level ="info"; - pdcp_log_level ="info"; - rrc_log_level ="info"; - f1ap_log_level ="info"; - ngap_log_level ="debug"; - }; -` - var ( - configurationTemplateForCuCp = template.Must(template.New("RanCuCpConfiguration").Parse(configurationTemplateSourceForCuCp)) - configurationTemplateForCuUp = template.Must(template.New("RanCuUpConfiguration").Parse(configurationTemplateSourceForCuUp)) - configurationTemplateForDu = template.Must(template.New("RanDuConfiguration").Parse(configurationTemplateSourceForDu)) - // O1-Telnet configurationTemplateForCuCpO1Telnet = template.Must(template.New("RanCuCpConfigurationO1").Parse(configurationTemplateSourceForCuCpO1Telnet)) configurationTemplateForCuUpO1Telnet = template.Must(template.New("RanCuUpConfigurationO1").Parse(configurationTemplateSourceForCuUpO1Telnet))