diff --git a/api/models/b_g_p_policy_defined_set_get_entry.go b/api/models/b_g_p_policy_defined_set_get_entry.go index 9bfbe2c0..d5673fa8 100644 --- a/api/models/b_g_p_policy_defined_set_get_entry.go +++ b/api/models/b_g_p_policy_defined_set_get_entry.go @@ -88,11 +88,6 @@ func (m *BGPPolicyDefinedSetGetEntry) contextValidatePrefixList(ctx context.Cont for i := 0; i < len(m.PrefixList); i++ { if m.PrefixList[i] != nil { - - if swag.IsZero(m.PrefixList[i]) { // not required - return nil - } - if err := m.PrefixList[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("prefixList" + "." + strconv.Itoa(i)) diff --git a/api/models/b_g_p_policy_defined_sets_mod.go b/api/models/b_g_p_policy_defined_sets_mod.go index 3a4d7bb4..8769b696 100644 --- a/api/models/b_g_p_policy_defined_sets_mod.go +++ b/api/models/b_g_p_policy_defined_sets_mod.go @@ -88,11 +88,6 @@ func (m *BGPPolicyDefinedSetsMod) contextValidatePrefixList(ctx context.Context, for i := 0; i < len(m.PrefixList); i++ { if m.PrefixList[i] != nil { - - if swag.IsZero(m.PrefixList[i]) { // not required - return nil - } - if err := m.PrefixList[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("prefixList" + "." + strconv.Itoa(i)) diff --git a/api/models/b_g_p_policy_definitions_mod.go b/api/models/b_g_p_policy_definitions_mod.go index c2d57a85..e49dd050 100644 --- a/api/models/b_g_p_policy_definitions_mod.go +++ b/api/models/b_g_p_policy_definitions_mod.go @@ -85,11 +85,6 @@ func (m *BGPPolicyDefinitionsMod) contextValidateStatements(ctx context.Context, for i := 0; i < len(m.Statements); i++ { if m.Statements[i] != nil { - - if swag.IsZero(m.Statements[i]) { // not required - return nil - } - if err := m.Statements[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("statements" + "." + strconv.Itoa(i)) diff --git a/api/models/b_g_p_policy_definitions_statement.go b/api/models/b_g_p_policy_definitions_statement.go index ed885da6..81d5cb40 100644 --- a/api/models/b_g_p_policy_definitions_statement.go +++ b/api/models/b_g_p_policy_definitions_statement.go @@ -105,11 +105,6 @@ func (m *BGPPolicyDefinitionsStatement) ContextValidate(ctx context.Context, for func (m *BGPPolicyDefinitionsStatement) contextValidateActions(ctx context.Context, formats strfmt.Registry) error { if m.Actions != nil { - - if swag.IsZero(m.Actions) { // not required - return nil - } - if err := m.Actions.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("actions") @@ -126,11 +121,6 @@ func (m *BGPPolicyDefinitionsStatement) contextValidateActions(ctx context.Conte func (m *BGPPolicyDefinitionsStatement) contextValidateConditions(ctx context.Context, formats strfmt.Registry) error { if m.Conditions != nil { - - if swag.IsZero(m.Conditions) { // not required - return nil - } - if err := m.Conditions.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("conditions") @@ -224,11 +214,6 @@ func (m *BGPPolicyDefinitionsStatementActions) ContextValidate(ctx context.Conte func (m *BGPPolicyDefinitionsStatementActions) contextValidateBgpActions(ctx context.Context, formats strfmt.Registry) error { if m.BgpActions != nil { - - if swag.IsZero(m.BgpActions) { // not required - return nil - } - if err := m.BgpActions.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("actions" + "." + "bgpActions") @@ -418,11 +403,6 @@ func (m *BGPPolicyDefinitionsStatementActionsBgpActions) ContextValidate(ctx con func (m *BGPPolicyDefinitionsStatementActionsBgpActions) contextValidateSetAsPathPrepend(ctx context.Context, formats strfmt.Registry) error { if m.SetAsPathPrepend != nil { - - if swag.IsZero(m.SetAsPathPrepend) { // not required - return nil - } - if err := m.SetAsPathPrepend.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("actions" + "." + "bgpActions" + "." + "setAsPathPrepend") @@ -439,11 +419,6 @@ func (m *BGPPolicyDefinitionsStatementActionsBgpActions) contextValidateSetAsPat func (m *BGPPolicyDefinitionsStatementActionsBgpActions) contextValidateSetCommunity(ctx context.Context, formats strfmt.Registry) error { if m.SetCommunity != nil { - - if swag.IsZero(m.SetCommunity) { // not required - return nil - } - if err := m.SetCommunity.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("actions" + "." + "bgpActions" + "." + "setCommunity") @@ -460,11 +435,6 @@ func (m *BGPPolicyDefinitionsStatementActionsBgpActions) contextValidateSetCommu func (m *BGPPolicyDefinitionsStatementActionsBgpActions) contextValidateSetExtCommunity(ctx context.Context, formats strfmt.Registry) error { if m.SetExtCommunity != nil { - - if swag.IsZero(m.SetExtCommunity) { // not required - return nil - } - if err := m.SetExtCommunity.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("actions" + "." + "bgpActions" + "." + "setExtCommunity") @@ -481,11 +451,6 @@ func (m *BGPPolicyDefinitionsStatementActionsBgpActions) contextValidateSetExtCo func (m *BGPPolicyDefinitionsStatementActionsBgpActions) contextValidateSetLargeCommunity(ctx context.Context, formats strfmt.Registry) error { if m.SetLargeCommunity != nil { - - if swag.IsZero(m.SetLargeCommunity) { // not required - return nil - } - if err := m.SetLargeCommunity.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("actions" + "." + "bgpActions" + "." + "setLargeCommunity") @@ -796,11 +761,6 @@ func (m *BGPPolicyDefinitionsStatementConditions) ContextValidate(ctx context.Co func (m *BGPPolicyDefinitionsStatementConditions) contextValidateBgpConditions(ctx context.Context, formats strfmt.Registry) error { if m.BgpConditions != nil { - - if swag.IsZero(m.BgpConditions) { // not required - return nil - } - if err := m.BgpConditions.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("conditions" + "." + "bgpConditions") @@ -817,11 +777,6 @@ func (m *BGPPolicyDefinitionsStatementConditions) contextValidateBgpConditions(c func (m *BGPPolicyDefinitionsStatementConditions) contextValidateMatchNeighborSet(ctx context.Context, formats strfmt.Registry) error { if m.MatchNeighborSet != nil { - - if swag.IsZero(m.MatchNeighborSet) { // not required - return nil - } - if err := m.MatchNeighborSet.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("conditions" + "." + "matchNeighborSet") @@ -838,11 +793,6 @@ func (m *BGPPolicyDefinitionsStatementConditions) contextValidateMatchNeighborSe func (m *BGPPolicyDefinitionsStatementConditions) contextValidateMatchPrefixSet(ctx context.Context, formats strfmt.Registry) error { if m.MatchPrefixSet != nil { - - if swag.IsZero(m.MatchPrefixSet) { // not required - return nil - } - if err := m.MatchPrefixSet.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("conditions" + "." + "matchPrefixSet") @@ -1065,11 +1015,6 @@ func (m *BGPPolicyDefinitionsStatementConditionsBgpConditions) ContextValidate(c func (m *BGPPolicyDefinitionsStatementConditionsBgpConditions) contextValidateAsPathLength(ctx context.Context, formats strfmt.Registry) error { if m.AsPathLength != nil { - - if swag.IsZero(m.AsPathLength) { // not required - return nil - } - if err := m.AsPathLength.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("conditions" + "." + "bgpConditions" + "." + "asPathLength") @@ -1086,11 +1031,6 @@ func (m *BGPPolicyDefinitionsStatementConditionsBgpConditions) contextValidateAs func (m *BGPPolicyDefinitionsStatementConditionsBgpConditions) contextValidateMatchAsPathSet(ctx context.Context, formats strfmt.Registry) error { if m.MatchAsPathSet != nil { - - if swag.IsZero(m.MatchAsPathSet) { // not required - return nil - } - if err := m.MatchAsPathSet.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("conditions" + "." + "bgpConditions" + "." + "matchAsPathSet") @@ -1107,11 +1047,6 @@ func (m *BGPPolicyDefinitionsStatementConditionsBgpConditions) contextValidateMa func (m *BGPPolicyDefinitionsStatementConditionsBgpConditions) contextValidateMatchCommunitySet(ctx context.Context, formats strfmt.Registry) error { if m.MatchCommunitySet != nil { - - if swag.IsZero(m.MatchCommunitySet) { // not required - return nil - } - if err := m.MatchCommunitySet.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("conditions" + "." + "bgpConditions" + "." + "matchCommunitySet") @@ -1128,11 +1063,6 @@ func (m *BGPPolicyDefinitionsStatementConditionsBgpConditions) contextValidateMa func (m *BGPPolicyDefinitionsStatementConditionsBgpConditions) contextValidateMatchExtCommunitySet(ctx context.Context, formats strfmt.Registry) error { if m.MatchExtCommunitySet != nil { - - if swag.IsZero(m.MatchExtCommunitySet) { // not required - return nil - } - if err := m.MatchExtCommunitySet.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("conditions" + "." + "bgpConditions" + "." + "matchExtCommunitySet") @@ -1149,11 +1079,6 @@ func (m *BGPPolicyDefinitionsStatementConditionsBgpConditions) contextValidateMa func (m *BGPPolicyDefinitionsStatementConditionsBgpConditions) contextValidateMatchLargeCommunitySet(ctx context.Context, formats strfmt.Registry) error { if m.MatchLargeCommunitySet != nil { - - if swag.IsZero(m.MatchLargeCommunitySet) { // not required - return nil - } - if err := m.MatchLargeCommunitySet.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("conditions" + "." + "bgpConditions" + "." + "matchLargeCommunitySet") diff --git a/api/models/firewall_entry.go b/api/models/firewall_entry.go index 571d5bc1..7de5c8fb 100644 --- a/api/models/firewall_entry.go +++ b/api/models/firewall_entry.go @@ -102,11 +102,6 @@ func (m *FirewallEntry) ContextValidate(ctx context.Context, formats strfmt.Regi func (m *FirewallEntry) contextValidateOpts(ctx context.Context, formats strfmt.Registry) error { if m.Opts != nil { - - if swag.IsZero(m.Opts) { // not required - return nil - } - if err := m.Opts.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("opts") @@ -123,11 +118,6 @@ func (m *FirewallEntry) contextValidateOpts(ctx context.Context, formats strfmt. func (m *FirewallEntry) contextValidateRuleArguments(ctx context.Context, formats strfmt.Registry) error { if m.RuleArguments != nil { - - if swag.IsZero(m.RuleArguments) { // not required - return nil - } - if err := m.RuleArguments.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("ruleArguments") diff --git a/api/models/loadbalance_entry.go b/api/models/loadbalance_entry.go index 5d76321f..eea7547a 100644 --- a/api/models/loadbalance_entry.go +++ b/api/models/loadbalance_entry.go @@ -149,11 +149,6 @@ func (m *LoadbalanceEntry) contextValidateEndpoints(ctx context.Context, formats for i := 0; i < len(m.Endpoints); i++ { if m.Endpoints[i] != nil { - - if swag.IsZero(m.Endpoints[i]) { // not required - return nil - } - if err := m.Endpoints[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("endpoints" + "." + strconv.Itoa(i)) @@ -174,11 +169,6 @@ func (m *LoadbalanceEntry) contextValidateSecondaryIPs(ctx context.Context, form for i := 0; i < len(m.SecondaryIPs); i++ { if m.SecondaryIPs[i] != nil { - - if swag.IsZero(m.SecondaryIPs[i]) { // not required - return nil - } - if err := m.SecondaryIPs[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("secondaryIPs" + "." + strconv.Itoa(i)) @@ -197,11 +187,6 @@ func (m *LoadbalanceEntry) contextValidateSecondaryIPs(ctx context.Context, form func (m *LoadbalanceEntry) contextValidateServiceArguments(ctx context.Context, formats strfmt.Registry) error { if m.ServiceArguments != nil { - - if swag.IsZero(m.ServiceArguments) { // not required - return nil - } - if err := m.ServiceArguments.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("serviceArguments") @@ -348,6 +333,9 @@ type LoadbalanceEntryServiceArguments struct { // service name Name string `json:"name,omitempty"` + // end-point specific op (0-create, 1-attachEP, 2-detachEP) + Oper int32 `json:"oper,omitempty"` + // port number for the access Port int64 `json:"port,omitempty"` diff --git a/api/models/mirror_entry.go b/api/models/mirror_entry.go index 1e75de1e..062dd2b1 100644 --- a/api/models/mirror_entry.go +++ b/api/models/mirror_entry.go @@ -105,11 +105,6 @@ func (m *MirrorEntry) ContextValidate(ctx context.Context, formats strfmt.Regist func (m *MirrorEntry) contextValidateMirrorInfo(ctx context.Context, formats strfmt.Registry) error { if m.MirrorInfo != nil { - - if swag.IsZero(m.MirrorInfo) { // not required - return nil - } - if err := m.MirrorInfo.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("mirrorInfo") @@ -126,11 +121,6 @@ func (m *MirrorEntry) contextValidateMirrorInfo(ctx context.Context, formats str func (m *MirrorEntry) contextValidateTargetObject(ctx context.Context, formats strfmt.Registry) error { if m.TargetObject != nil { - - if swag.IsZero(m.TargetObject) { // not required - return nil - } - if err := m.TargetObject.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("targetObject") diff --git a/api/models/mirror_get_entry.go b/api/models/mirror_get_entry.go index f9a7cb0b..62910e70 100644 --- a/api/models/mirror_get_entry.go +++ b/api/models/mirror_get_entry.go @@ -123,11 +123,6 @@ func (m *MirrorGetEntry) ContextValidate(ctx context.Context, formats strfmt.Reg func (m *MirrorGetEntry) contextValidateMirrorInfo(ctx context.Context, formats strfmt.Registry) error { if m.MirrorInfo != nil { - - if swag.IsZero(m.MirrorInfo) { // not required - return nil - } - if err := m.MirrorInfo.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("mirrorInfo") @@ -144,11 +139,6 @@ func (m *MirrorGetEntry) contextValidateMirrorInfo(ctx context.Context, formats func (m *MirrorGetEntry) contextValidateTargetObject(ctx context.Context, formats strfmt.Registry) error { if m.TargetObject != nil { - - if swag.IsZero(m.TargetObject) { // not required - return nil - } - if err := m.TargetObject.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("targetObject") diff --git a/api/models/policy_entry.go b/api/models/policy_entry.go index f1b62d4d..b9935512 100644 --- a/api/models/policy_entry.go +++ b/api/models/policy_entry.go @@ -105,11 +105,6 @@ func (m *PolicyEntry) ContextValidate(ctx context.Context, formats strfmt.Regist func (m *PolicyEntry) contextValidatePolicyInfo(ctx context.Context, formats strfmt.Registry) error { if m.PolicyInfo != nil { - - if swag.IsZero(m.PolicyInfo) { // not required - return nil - } - if err := m.PolicyInfo.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("policyInfo") @@ -126,11 +121,6 @@ func (m *PolicyEntry) contextValidatePolicyInfo(ctx context.Context, formats str func (m *PolicyEntry) contextValidateTargetObject(ctx context.Context, formats strfmt.Registry) error { if m.TargetObject != nil { - - if swag.IsZero(m.TargetObject) { // not required - return nil - } - if err := m.TargetObject.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("targetObject") diff --git a/api/models/port_entry.go b/api/models/port_entry.go index d6273add..09fde040 100644 --- a/api/models/port_entry.go +++ b/api/models/port_entry.go @@ -204,11 +204,6 @@ func (m *PortEntry) ContextValidate(ctx context.Context, formats strfmt.Registry func (m *PortEntry) contextValidatePortHardwareInformation(ctx context.Context, formats strfmt.Registry) error { if m.PortHardwareInformation != nil { - - if swag.IsZero(m.PortHardwareInformation) { // not required - return nil - } - if err := m.PortHardwareInformation.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("portHardwareInformation") @@ -225,11 +220,6 @@ func (m *PortEntry) contextValidatePortHardwareInformation(ctx context.Context, func (m *PortEntry) contextValidatePortL2Information(ctx context.Context, formats strfmt.Registry) error { if m.PortL2Information != nil { - - if swag.IsZero(m.PortL2Information) { // not required - return nil - } - if err := m.PortL2Information.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("portL2Information") @@ -246,11 +236,6 @@ func (m *PortEntry) contextValidatePortL2Information(ctx context.Context, format func (m *PortEntry) contextValidatePortL3Information(ctx context.Context, formats strfmt.Registry) error { if m.PortL3Information != nil { - - if swag.IsZero(m.PortL3Information) { // not required - return nil - } - if err := m.PortL3Information.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("portL3Information") @@ -267,11 +252,6 @@ func (m *PortEntry) contextValidatePortL3Information(ctx context.Context, format func (m *PortEntry) contextValidatePortSoftwareInformation(ctx context.Context, formats strfmt.Registry) error { if m.PortSoftwareInformation != nil { - - if swag.IsZero(m.PortSoftwareInformation) { // not required - return nil - } - if err := m.PortSoftwareInformation.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("portSoftwareInformation") @@ -288,11 +268,6 @@ func (m *PortEntry) contextValidatePortSoftwareInformation(ctx context.Context, func (m *PortEntry) contextValidatePortStatisticInformation(ctx context.Context, formats strfmt.Registry) error { if m.PortStatisticInformation != nil { - - if swag.IsZero(m.PortStatisticInformation) { // not required - return nil - } - if err := m.PortStatisticInformation.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("portStatisticInformation") diff --git a/api/models/route_get_entry.go b/api/models/route_get_entry.go index fbb3da5e..f83534b4 100644 --- a/api/models/route_get_entry.go +++ b/api/models/route_get_entry.go @@ -91,11 +91,6 @@ func (m *RouteGetEntry) ContextValidate(ctx context.Context, formats strfmt.Regi func (m *RouteGetEntry) contextValidateStatistic(ctx context.Context, formats strfmt.Registry) error { if m.Statistic != nil { - - if swag.IsZero(m.Statistic) { // not required - return nil - } - if err := m.Statistic.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("statistic") diff --git a/api/models/session_entry.go b/api/models/session_entry.go index 6926eb34..1bfb83af 100644 --- a/api/models/session_entry.go +++ b/api/models/session_entry.go @@ -108,11 +108,6 @@ func (m *SessionEntry) ContextValidate(ctx context.Context, formats strfmt.Regis func (m *SessionEntry) contextValidateAccessNetworkTunnel(ctx context.Context, formats strfmt.Registry) error { if m.AccessNetworkTunnel != nil { - - if swag.IsZero(m.AccessNetworkTunnel) { // not required - return nil - } - if err := m.AccessNetworkTunnel.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("accessNetworkTunnel") @@ -129,11 +124,6 @@ func (m *SessionEntry) contextValidateAccessNetworkTunnel(ctx context.Context, f func (m *SessionEntry) contextValidateCoreNetworkTunnel(ctx context.Context, formats strfmt.Registry) error { if m.CoreNetworkTunnel != nil { - - if swag.IsZero(m.CoreNetworkTunnel) { // not required - return nil - } - if err := m.CoreNetworkTunnel.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("coreNetworkTunnel") diff --git a/api/models/session_ul_cl_entry.go b/api/models/session_ul_cl_entry.go index b60c9069..1d0a8500 100644 --- a/api/models/session_ul_cl_entry.go +++ b/api/models/session_ul_cl_entry.go @@ -75,11 +75,6 @@ func (m *SessionUlClEntry) ContextValidate(ctx context.Context, formats strfmt.R func (m *SessionUlClEntry) contextValidateUlclArgument(ctx context.Context, formats strfmt.Registry) error { if m.UlclArgument != nil { - - if swag.IsZero(m.UlclArgument) { // not required - return nil - } - if err := m.UlclArgument.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("ulclArgument") diff --git a/api/models/vlan_get_entry.go b/api/models/vlan_get_entry.go index e20cdb09..b7d28b37 100644 --- a/api/models/vlan_get_entry.go +++ b/api/models/vlan_get_entry.go @@ -118,11 +118,6 @@ func (m *VlanGetEntry) contextValidateMember(ctx context.Context, formats strfmt for i := 0; i < len(m.Member); i++ { if m.Member[i] != nil { - - if swag.IsZero(m.Member[i]) { // not required - return nil - } - if err := m.Member[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("member" + "." + strconv.Itoa(i)) @@ -141,11 +136,6 @@ func (m *VlanGetEntry) contextValidateMember(ctx context.Context, formats strfmt func (m *VlanGetEntry) contextValidateVlanStatistic(ctx context.Context, formats strfmt.Registry) error { if m.VlanStatistic != nil { - - if swag.IsZero(m.VlanStatistic) { // not required - return nil - } - if err := m.VlanStatistic.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("vlanStatistic") diff --git a/api/restapi/embedded_spec.go b/api/restapi/embedded_spec.go index b6d1c267..fc7362b5 100644 --- a/api/restapi/embedded_spec.go +++ b/api/restapi/embedded_spec.go @@ -4871,6 +4871,11 @@ func init() { "description": "service name", "type": "string" }, + "oper": { + "description": "end-point specific op (0-create, 1-attachEP, 2-detachEP)", + "type": "integer", + "format": "int32" + }, "port": { "description": "port number for the access", "type": "integer" @@ -10816,6 +10821,11 @@ func init() { "description": "service name", "type": "string" }, + "oper": { + "description": "end-point specific op (0-create, 1-attachEP, 2-detachEP)", + "type": "integer", + "format": "int32" + }, "port": { "description": "port number for the access", "type": "integer" @@ -10929,6 +10939,11 @@ func init() { "description": "service name", "type": "string" }, + "oper": { + "description": "end-point specific op (0-create, 1-attachEP, 2-detachEP)", + "type": "integer", + "format": "int32" + }, "port": { "description": "port number for the access", "type": "integer" diff --git a/api/restapi/handler/loadbalancer.go b/api/restapi/handler/loadbalancer.go index 7a6fb547..03cacc29 100644 --- a/api/restapi/handler/loadbalancer.go +++ b/api/restapi/handler/loadbalancer.go @@ -45,6 +45,7 @@ func ConfigPostLoadbalancer(params operations.PostConfigLoadbalancerParams) midd lbRules.Serv.ProbeTimeout = params.Attr.ServiceArguments.ProbeTimeout lbRules.Serv.ProbeRetries = int(params.Attr.ServiceArguments.ProbeRetries) lbRules.Serv.Name = params.Attr.ServiceArguments.Name + lbRules.Serv.Oper = cmn.LBOp(params.Attr.ServiceArguments.Oper) if lbRules.Serv.Proto == "sctp" { for _, data := range params.Attr.SecondaryIPs { diff --git a/api/restapi/operations/get_config_bfd_all.go b/api/restapi/operations/get_config_bfd_all.go index e689166f..1450cf53 100644 --- a/api/restapi/operations/get_config_bfd_all.go +++ b/api/restapi/operations/get_config_bfd_all.go @@ -132,11 +132,6 @@ func (o *GetConfigBfdAllOKBody) contextValidateAttr(ctx context.Context, formats for i := 0; i < len(o.Attr); i++ { if o.Attr[i] != nil { - - if swag.IsZero(o.Attr[i]) { // not required - return nil - } - if err := o.Attr[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("getConfigBfdAllOK" + "." + "Attr" + "." + strconv.Itoa(i)) diff --git a/api/restapi/operations/get_config_bgp_neigh_all.go b/api/restapi/operations/get_config_bgp_neigh_all.go index 43d6434a..f6def74b 100644 --- a/api/restapi/operations/get_config_bgp_neigh_all.go +++ b/api/restapi/operations/get_config_bgp_neigh_all.go @@ -132,11 +132,6 @@ func (o *GetConfigBgpNeighAllOKBody) contextValidateBgpNeiAttr(ctx context.Conte for i := 0; i < len(o.BgpNeiAttr); i++ { if o.BgpNeiAttr[i] != nil { - - if swag.IsZero(o.BgpNeiAttr[i]) { // not required - return nil - } - if err := o.BgpNeiAttr[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("getConfigBgpNeighAllOK" + "." + "bgpNeiAttr" + "." + strconv.Itoa(i)) diff --git a/api/restapi/operations/get_config_bgp_policy_definedsets_defineset_type_type_name.go b/api/restapi/operations/get_config_bgp_policy_definedsets_defineset_type_type_name.go index f0da6968..0bb01bb6 100644 --- a/api/restapi/operations/get_config_bgp_policy_definedsets_defineset_type_type_name.go +++ b/api/restapi/operations/get_config_bgp_policy_definedsets_defineset_type_type_name.go @@ -132,11 +132,6 @@ func (o *GetConfigBgpPolicyDefinedsetsDefinesetTypeTypeNameOKBody) contextValida for i := 0; i < len(o.DefinedsetsAttr); i++ { if o.DefinedsetsAttr[i] != nil { - - if swag.IsZero(o.DefinedsetsAttr[i]) { // not required - return nil - } - if err := o.DefinedsetsAttr[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("getConfigBgpPolicyDefinedsetsDefinesetTypeTypeNameOK" + "." + "definedsetsAttr" + "." + strconv.Itoa(i)) diff --git a/api/restapi/operations/get_config_bgp_policy_definitions_all.go b/api/restapi/operations/get_config_bgp_policy_definitions_all.go index f28af032..523340e5 100644 --- a/api/restapi/operations/get_config_bgp_policy_definitions_all.go +++ b/api/restapi/operations/get_config_bgp_policy_definitions_all.go @@ -132,11 +132,6 @@ func (o *GetConfigBgpPolicyDefinitionsAllOKBody) contextValidateBgpPolicyAttr(ct for i := 0; i < len(o.BgpPolicyAttr); i++ { if o.BgpPolicyAttr[i] != nil { - - if swag.IsZero(o.BgpPolicyAttr[i]) { // not required - return nil - } - if err := o.BgpPolicyAttr[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("getConfigBgpPolicyDefinitionsAllOK" + "." + "bgpPolicyAttr" + "." + strconv.Itoa(i)) diff --git a/api/restapi/operations/get_config_cistate_all.go b/api/restapi/operations/get_config_cistate_all.go index 005aef2a..7c792381 100644 --- a/api/restapi/operations/get_config_cistate_all.go +++ b/api/restapi/operations/get_config_cistate_all.go @@ -132,11 +132,6 @@ func (o *GetConfigCistateAllOKBody) contextValidateAttr(ctx context.Context, for for i := 0; i < len(o.Attr); i++ { if o.Attr[i] != nil { - - if swag.IsZero(o.Attr[i]) { // not required - return nil - } - if err := o.Attr[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("getConfigCistateAllOK" + "." + "Attr" + "." + strconv.Itoa(i)) diff --git a/api/restapi/operations/get_config_conntrack_all.go b/api/restapi/operations/get_config_conntrack_all.go index fdd98f30..b6e73fca 100644 --- a/api/restapi/operations/get_config_conntrack_all.go +++ b/api/restapi/operations/get_config_conntrack_all.go @@ -132,11 +132,6 @@ func (o *GetConfigConntrackAllOKBody) contextValidateCtAttr(ctx context.Context, for i := 0; i < len(o.CtAttr); i++ { if o.CtAttr[i] != nil { - - if swag.IsZero(o.CtAttr[i]) { // not required - return nil - } - if err := o.CtAttr[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("getConfigConntrackAllOK" + "." + "ctAttr" + "." + strconv.Itoa(i)) diff --git a/api/restapi/operations/get_config_endpoint_all.go b/api/restapi/operations/get_config_endpoint_all.go index dc7cb647..014afbde 100644 --- a/api/restapi/operations/get_config_endpoint_all.go +++ b/api/restapi/operations/get_config_endpoint_all.go @@ -132,11 +132,6 @@ func (o *GetConfigEndpointAllOKBody) contextValidateAttr(ctx context.Context, fo for i := 0; i < len(o.Attr); i++ { if o.Attr[i] != nil { - - if swag.IsZero(o.Attr[i]) { // not required - return nil - } - if err := o.Attr[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("getConfigEndpointAllOK" + "." + "Attr" + "." + strconv.Itoa(i)) diff --git a/api/restapi/operations/get_config_fdb_all.go b/api/restapi/operations/get_config_fdb_all.go index c5181c17..64ea648b 100644 --- a/api/restapi/operations/get_config_fdb_all.go +++ b/api/restapi/operations/get_config_fdb_all.go @@ -132,11 +132,6 @@ func (o *GetConfigFdbAllOKBody) contextValidateFdbAttr(ctx context.Context, form for i := 0; i < len(o.FdbAttr); i++ { if o.FdbAttr[i] != nil { - - if swag.IsZero(o.FdbAttr[i]) { // not required - return nil - } - if err := o.FdbAttr[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("getConfigFdbAllOK" + "." + "fdbAttr" + "." + strconv.Itoa(i)) diff --git a/api/restapi/operations/get_config_firewall_all.go b/api/restapi/operations/get_config_firewall_all.go index 79031bfb..de42ddaf 100644 --- a/api/restapi/operations/get_config_firewall_all.go +++ b/api/restapi/operations/get_config_firewall_all.go @@ -132,11 +132,6 @@ func (o *GetConfigFirewallAllOKBody) contextValidateFwAttr(ctx context.Context, for i := 0; i < len(o.FwAttr); i++ { if o.FwAttr[i] != nil { - - if swag.IsZero(o.FwAttr[i]) { // not required - return nil - } - if err := o.FwAttr[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("getConfigFirewallAllOK" + "." + "fwAttr" + "." + strconv.Itoa(i)) diff --git a/api/restapi/operations/get_config_ipv4address_all.go b/api/restapi/operations/get_config_ipv4address_all.go index 29e3b484..4b5c94e8 100644 --- a/api/restapi/operations/get_config_ipv4address_all.go +++ b/api/restapi/operations/get_config_ipv4address_all.go @@ -132,11 +132,6 @@ func (o *GetConfigIpv4addressAllOKBody) contextValidateIPAttr(ctx context.Contex for i := 0; i < len(o.IPAttr); i++ { if o.IPAttr[i] != nil { - - if swag.IsZero(o.IPAttr[i]) { // not required - return nil - } - if err := o.IPAttr[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("getConfigIpv4addressAllOK" + "." + "ipAttr" + "." + strconv.Itoa(i)) diff --git a/api/restapi/operations/get_config_loadbalancer_all.go b/api/restapi/operations/get_config_loadbalancer_all.go index c7c5146a..2f460083 100644 --- a/api/restapi/operations/get_config_loadbalancer_all.go +++ b/api/restapi/operations/get_config_loadbalancer_all.go @@ -132,11 +132,6 @@ func (o *GetConfigLoadbalancerAllOKBody) contextValidateLbAttr(ctx context.Conte for i := 0; i < len(o.LbAttr); i++ { if o.LbAttr[i] != nil { - - if swag.IsZero(o.LbAttr[i]) { // not required - return nil - } - if err := o.LbAttr[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("getConfigLoadbalancerAllOK" + "." + "lbAttr" + "." + strconv.Itoa(i)) diff --git a/api/restapi/operations/get_config_mirror_all.go b/api/restapi/operations/get_config_mirror_all.go index abc19dc9..469edc0f 100644 --- a/api/restapi/operations/get_config_mirror_all.go +++ b/api/restapi/operations/get_config_mirror_all.go @@ -132,11 +132,6 @@ func (o *GetConfigMirrorAllOKBody) contextValidateMirrAttr(ctx context.Context, for i := 0; i < len(o.MirrAttr); i++ { if o.MirrAttr[i] != nil { - - if swag.IsZero(o.MirrAttr[i]) { // not required - return nil - } - if err := o.MirrAttr[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("getConfigMirrorAllOK" + "." + "mirrAttr" + "." + strconv.Itoa(i)) diff --git a/api/restapi/operations/get_config_neighbor_all.go b/api/restapi/operations/get_config_neighbor_all.go index 71424804..6898458a 100644 --- a/api/restapi/operations/get_config_neighbor_all.go +++ b/api/restapi/operations/get_config_neighbor_all.go @@ -132,11 +132,6 @@ func (o *GetConfigNeighborAllOKBody) contextValidateNeighborAttr(ctx context.Con for i := 0; i < len(o.NeighborAttr); i++ { if o.NeighborAttr[i] != nil { - - if swag.IsZero(o.NeighborAttr[i]) { // not required - return nil - } - if err := o.NeighborAttr[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("getConfigNeighborAllOK" + "." + "neighborAttr" + "." + strconv.Itoa(i)) diff --git a/api/restapi/operations/get_config_policy_all.go b/api/restapi/operations/get_config_policy_all.go index 73835733..189bcdc5 100644 --- a/api/restapi/operations/get_config_policy_all.go +++ b/api/restapi/operations/get_config_policy_all.go @@ -132,11 +132,6 @@ func (o *GetConfigPolicyAllOKBody) contextValidatePolAttr(ctx context.Context, f for i := 0; i < len(o.PolAttr); i++ { if o.PolAttr[i] != nil { - - if swag.IsZero(o.PolAttr[i]) { // not required - return nil - } - if err := o.PolAttr[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("getConfigPolicyAllOK" + "." + "polAttr" + "." + strconv.Itoa(i)) diff --git a/api/restapi/operations/get_config_port_all.go b/api/restapi/operations/get_config_port_all.go index b2c35dfc..b7e64592 100644 --- a/api/restapi/operations/get_config_port_all.go +++ b/api/restapi/operations/get_config_port_all.go @@ -132,11 +132,6 @@ func (o *GetConfigPortAllOKBody) contextValidatePortAttr(ctx context.Context, fo for i := 0; i < len(o.PortAttr); i++ { if o.PortAttr[i] != nil { - - if swag.IsZero(o.PortAttr[i]) { // not required - return nil - } - if err := o.PortAttr[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("getConfigPortAllOK" + "." + "portAttr" + "." + strconv.Itoa(i)) diff --git a/api/restapi/operations/get_config_route_all.go b/api/restapi/operations/get_config_route_all.go index 715bd448..f4430d26 100644 --- a/api/restapi/operations/get_config_route_all.go +++ b/api/restapi/operations/get_config_route_all.go @@ -132,11 +132,6 @@ func (o *GetConfigRouteAllOKBody) contextValidateRouteAttr(ctx context.Context, for i := 0; i < len(o.RouteAttr); i++ { if o.RouteAttr[i] != nil { - - if swag.IsZero(o.RouteAttr[i]) { // not required - return nil - } - if err := o.RouteAttr[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("getConfigRouteAllOK" + "." + "routeAttr" + "." + strconv.Itoa(i)) diff --git a/api/restapi/operations/get_config_session_all.go b/api/restapi/operations/get_config_session_all.go index e51e2c2f..3e30ac8e 100644 --- a/api/restapi/operations/get_config_session_all.go +++ b/api/restapi/operations/get_config_session_all.go @@ -132,11 +132,6 @@ func (o *GetConfigSessionAllOKBody) contextValidateSessionAttr(ctx context.Conte for i := 0; i < len(o.SessionAttr); i++ { if o.SessionAttr[i] != nil { - - if swag.IsZero(o.SessionAttr[i]) { // not required - return nil - } - if err := o.SessionAttr[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("getConfigSessionAllOK" + "." + "sessionAttr" + "." + strconv.Itoa(i)) diff --git a/api/restapi/operations/get_config_sessionulcl_all.go b/api/restapi/operations/get_config_sessionulcl_all.go index 75651885..76db8c58 100644 --- a/api/restapi/operations/get_config_sessionulcl_all.go +++ b/api/restapi/operations/get_config_sessionulcl_all.go @@ -132,11 +132,6 @@ func (o *GetConfigSessionulclAllOKBody) contextValidateUlclAttr(ctx context.Cont for i := 0; i < len(o.UlclAttr); i++ { if o.UlclAttr[i] != nil { - - if swag.IsZero(o.UlclAttr[i]) { // not required - return nil - } - if err := o.UlclAttr[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("getConfigSessionulclAllOK" + "." + "ulclAttr" + "." + strconv.Itoa(i)) diff --git a/api/restapi/operations/get_config_tunnel_vxlan_all.go b/api/restapi/operations/get_config_tunnel_vxlan_all.go index 06be7488..d79cfe1a 100644 --- a/api/restapi/operations/get_config_tunnel_vxlan_all.go +++ b/api/restapi/operations/get_config_tunnel_vxlan_all.go @@ -132,11 +132,6 @@ func (o *GetConfigTunnelVxlanAllOKBody) contextValidateVxlanAttr(ctx context.Con for i := 0; i < len(o.VxlanAttr); i++ { if o.VxlanAttr[i] != nil { - - if swag.IsZero(o.VxlanAttr[i]) { // not required - return nil - } - if err := o.VxlanAttr[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("getConfigTunnelVxlanAllOK" + "." + "vxlanAttr" + "." + strconv.Itoa(i)) diff --git a/api/restapi/operations/get_config_vlan_all.go b/api/restapi/operations/get_config_vlan_all.go index f52141cd..e38e217b 100644 --- a/api/restapi/operations/get_config_vlan_all.go +++ b/api/restapi/operations/get_config_vlan_all.go @@ -132,11 +132,6 @@ func (o *GetConfigVlanAllOKBody) contextValidateVlanAttr(ctx context.Context, fo for i := 0; i < len(o.VlanAttr); i++ { if o.VlanAttr[i] != nil { - - if swag.IsZero(o.VlanAttr[i]) { // not required - return nil - } - if err := o.VlanAttr[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("getConfigVlanAllOK" + "." + "vlanAttr" + "." + strconv.Itoa(i)) diff --git a/api/restapi/operations/get_status_filesystem.go b/api/restapi/operations/get_status_filesystem.go index 54e46369..817708ad 100644 --- a/api/restapi/operations/get_status_filesystem.go +++ b/api/restapi/operations/get_status_filesystem.go @@ -132,11 +132,6 @@ func (o *GetStatusFilesystemOKBody) contextValidateFilesystemAttr(ctx context.Co for i := 0; i < len(o.FilesystemAttr); i++ { if o.FilesystemAttr[i] != nil { - - if swag.IsZero(o.FilesystemAttr[i]) { // not required - return nil - } - if err := o.FilesystemAttr[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("getStatusFilesystemOK" + "." + "filesystemAttr" + "." + strconv.Itoa(i)) diff --git a/api/restapi/operations/get_status_process.go b/api/restapi/operations/get_status_process.go index 4d25fd72..b4fc54b1 100644 --- a/api/restapi/operations/get_status_process.go +++ b/api/restapi/operations/get_status_process.go @@ -132,11 +132,6 @@ func (o *GetStatusProcessOKBody) contextValidateProcessAttr(ctx context.Context, for i := 0; i < len(o.ProcessAttr); i++ { if o.ProcessAttr[i] != nil { - - if swag.IsZero(o.ProcessAttr[i]) { // not required - return nil - } - if err := o.ProcessAttr[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("getStatusProcessOK" + "." + "processAttr" + "." + strconv.Itoa(i)) diff --git a/api/restapi/operations/loxilb_rest_api_api.go b/api/restapi/operations/loxilb_rest_api_api.go index 76862f33..ff406d36 100644 --- a/api/restapi/operations/loxilb_rest_api_api.go +++ b/api/restapi/operations/loxilb_rest_api_api.go @@ -1112,6 +1112,6 @@ func (o *LoxilbRestAPIAPI) AddMiddlewareFor(method, path string, builder middlew } o.Init() if h, ok := o.handlers[um][path]; ok { - o.handlers[um][path] = builder(h) + o.handlers[method][path] = builder(h) } } diff --git a/api/swagger.yml b/api/swagger.yml index 17027448..91c6dd7a 100644 --- a/api/swagger.yml +++ b/api/swagger.yml @@ -2850,6 +2850,10 @@ definitions: name: type: string description: service name + oper: + type: integer + format: int32 + description: end-point specific op (0-create, 1-attachEP, 2-detachEP) endpoints: type: array diff --git a/common/common.go b/common/common.go index ecdb85f3..229ee0de 100644 --- a/common/common.go +++ b/common/common.go @@ -495,6 +495,18 @@ const ( LBModeHostOneArm ) +// LBOp - Variable to LB operation +type LBOp int32 + +const ( + // LBOPAdd - Add te LB rule (replace if existing) + LBOPAdd LBOp = iota + // LBModeOneArm - Attach End-Points + LBOPAttach + // LBOPDetach - Detach End-Points + LBOPDetach +) + // LbServiceArg - Information related to load-balancer service type LbServiceArg struct { // ServIP - the service ip or vip of the load-balancer rule @@ -511,6 +523,8 @@ type LbServiceArg struct { Bgp bool `json:"bgp"` // Monitor - monitor end-points of this rule Monitor bool `json:"monitor"` + // Oper - Attach/Detach if the LB already exists + Oper LBOp `json:"oper"` // Mode - NAT mode Mode LBMode `json:"mode"` // InactiveTimeout - Forced session reset after inactive timeout diff --git a/pkg/loxinet/mirror.go b/pkg/loxinet/mirror.go index 34c4d1e5..b3d13e6c 100644 --- a/pkg/loxinet/mirror.go +++ b/pkg/loxinet/mirror.go @@ -262,8 +262,7 @@ func (M *MirrH) MirrTicker() { } else { for idx, mObj := range m.MObjs { - var pM *MirrObjInfo - pM = &m.MObjs[idx] + pM := &m.MObjs[idx] if pM.Sync != 0 { pM.MirrObj2DP(DpCreate) } else { diff --git a/pkg/loxinet/rules.go b/pkg/loxinet/rules.go index f00ee6f4..10cfd57e 100644 --- a/pkg/loxinet/rules.go +++ b/pkg/loxinet/rules.go @@ -1263,6 +1263,70 @@ func (R *RuleH) addVIPSys(r *ruleEnt) { } } +func getLBArms(oldEps []ruleNatEp, newEps []ruleNatEp, oper cmn.LBOp) (bool, []ruleNatEp) { + var retEps []ruleNatEp + ruleChg := false + found := false + + for i, eEp := range oldEps { + for j, nEp := range newEps { + if eEp.xIP.Equal(nEp.xIP) && + eEp.xPort == nEp.xPort { + e := &oldEps[i] + n := &newEps[j] + if eEp.inActive && oper != cmn.LBOPDetach { + ruleChg = true + e.inActive = false + } + if e.weight != nEp.weight { + ruleChg = true + e.weight = nEp.weight + } + e.chkVal = true + n.chkVal = true + found = true + break + } + } + } + + // Remove LB arms from an existing LB + if oper == cmn.LBOPDetach { + if !found { + return false, oldEps + } + for i := range oldEps { + e := &oldEps[i] + if !e.chkVal { + retEps = append(retEps, *e) + } + } + return true, retEps + } + + retEps = oldEps + + // Attach LB arms to an existing LB + for i, nEp := range newEps { + n := &newEps[i] + if !nEp.chkVal { + ruleChg = true + n.chkVal = true + retEps = append(retEps, *n) + } + } + + for i, eEp := range retEps { + e := &retEps[i] + if !eEp.chkVal && oper == cmn.LBOPAdd { + ruleChg = true + e.inActive = true + } + e.chkVal = false + } + return ruleChg, retEps +} + // AddNatLbRule - Add a service LB nat rule. The service details are passed in serv argument, // and end-point information is passed in the slice servEndPoints. On success, // it will return 0 and nil error, else appropriate return code and error string will be set @@ -1427,43 +1491,7 @@ func (R *RuleH) AddNatLbRule(serv cmn.LbServiceArg, servSecIPs []cmn.LbSecIPArg, // If a NAT rule already exists, we try not reschuffle the order of the end-points. // We will try to append the new end-points at the end, while marking any other end-points // not in the new list as inactive - ruleChg := false - eEps := eRule.act.action.(*ruleNatActs).endPoints - for i, eEp := range eEps { - for j, nEp := range natActs.endPoints { - if eEp.xIP.Equal(nEp.xIP) && - eEp.xPort == nEp.xPort && - eEp.weight == nEp.weight { - e := &eEps[i] - n := &natActs.endPoints[j] - if eEp.inActive { - ruleChg = true - e.inActive = false - } - e.chkVal = true - n.chkVal = true - break - } - } - } - - for i, nEp := range natActs.endPoints { - n := &natActs.endPoints[i] - if !nEp.chkVal { - ruleChg = true - n.chkVal = true - eEps = append(eEps, *n) - } - } - - for i, eEp := range eEps { - e := &eEps[i] - if !eEp.chkVal { - ruleChg = true - e.inActive = true - } - e.chkVal = false - } + ruleChg, retEps := getLBArms(eRule.act.action.(*ruleNatActs).endPoints, natActs.endPoints, serv.Oper) if eRule.hChk.prbType != serv.ProbeType || eRule.hChk.prbPort != serv.ProbePort || eRule.hChk.prbReq != serv.ProbeReq || eRule.hChk.prbResp != serv.ProbeResp || @@ -1476,6 +1504,11 @@ func (R *RuleH) AddNatLbRule(serv cmn.LbServiceArg, servSecIPs []cmn.LbSecIPArg, return RuleExistsErr, errors.New("lbrule-exists error") } + if len(retEps) == 0 { + tk.LogIt(tk.LogDebug, "nat lb-rule %s has no-endpoints: to be deleted\n", eRule.tuples.String()) + return R.DeleteNatLbRule(serv) + } + // Update the rule eRule.hChk.prbType = serv.ProbeType eRule.hChk.prbPort = serv.ProbePort @@ -1485,12 +1518,12 @@ func (R *RuleH) AddNatLbRule(serv cmn.LbServiceArg, servSecIPs []cmn.LbSecIPArg, eRule.hChk.prbTimeo = serv.ProbeTimeout eRule.pTO = serv.PersistTimeout eRule.act.action.(*ruleNatActs).sel = natActs.sel - eRule.act.action.(*ruleNatActs).endPoints = eEps + eRule.act.action.(*ruleNatActs).endPoints = retEps eRule.act.action.(*ruleNatActs).mode = natActs.mode // Managed flag can't be modified on the fly // eRule.managed = serv.Managed - R.modNatEpHost(eRule, eEps, true, activateProbe) + R.modNatEpHost(eRule, retEps, true, activateProbe) R.electEPSrc(eRule) eRule.sT = time.Now() @@ -1499,6 +1532,9 @@ func (R *RuleH) AddNatLbRule(serv cmn.LbServiceArg, servSecIPs []cmn.LbSecIPArg, eRule.DP(DpCreate) return 0, nil + } else if serv.Oper == cmn.LBOPDetach { + tk.LogIt(tk.LogInfo, "nat lb-rule %s-%v-%s does not exist\n", serv.ServIP, serv.ServPort, serv.Proto) + return RuleNotExistsErr, errors.New("lbrule not-exists error") } r := new(ruleEnt)