Skip to content

Commit

Permalink
Merge branch 'fix-41012' into 'feature-L7lb'
Browse files Browse the repository at this point in the history
[BugFix: ZSTACK-41012]

See merge request zstackio/zstack!1084
  • Loading branch information
gitlab committed Jun 9, 2021
2 parents 4faab21 + 7708c80 commit aba63f8
Show file tree
Hide file tree
Showing 3 changed files with 129 additions and 3 deletions.
Expand Up @@ -34,6 +34,12 @@ public static enum HealthCheckMothod {
HEAD
}

public static enum MatchMethod {
Domain,
Url,
DomainAndUrl
}

public static enum HealthCheckStatusCode {
http_2xx,
http_3xx,
Expand Down
Expand Up @@ -30,6 +30,9 @@
import org.zstack.header.errorcode.ErrorCodeList;
import org.zstack.header.errorcode.OperationFailureException;
import org.zstack.header.exception.CloudRuntimeException;
import org.zstack.header.identity.AccountVO_;
import org.zstack.header.identity.role.RoleVO;
import org.zstack.header.identity.role.RoleVO_;
import org.zstack.header.message.APIMessage;
import org.zstack.header.message.MessageReply;
import org.zstack.header.network.l3.L3NetworkInventory;
Expand Down Expand Up @@ -724,9 +727,11 @@ private List<LbTO.RedirectRule> makeRedirectAcl(LoadBalancerListenerInventory li
}
}

boolean isDefaultPort = false; // http 80;https 443
ArrayList<LbTO.RedirectRule> formatRedirectRules = new ArrayList<>();
if ( (lbTO.getMode().equals(LoadBalancerConstants.LB_PROTOCOL_HTTP) && lbTO.getLoadBalancerPort() == LoadBalancerConstants.PROTOCOL_HTTP_DEFAULT_PORT ) || (lbTO.getMode().equals(LoadBalancerConstants.LB_PROTOCOL_HTTPS) && lbTO.getLoadBalancerPort() == LoadBalancerConstants.PROTOCOL_HTTPS_DEFAULT_PORT) ){
formatRedirectRules.addAll(redirectRules);
isDefaultPort = true;
}

for(LbTO.RedirectRule rule:redirectRules){
Expand All @@ -735,14 +740,23 @@ private List<LbTO.RedirectRule> makeRedirectAcl(LoadBalancerListenerInventory li
formatRule.setRedirectRuleUuid(rule.getRedirectRuleUuid());
formatRule.setAclUuid(rule.getAclUuid());
formatRule.setServerGroupUuid(rule.getServerGroupUuid());
formatRedirectRule(formatRule, lbTO);

formatRedirectRules.add(formatRule);
String matchMethod = Q.New(AccessControlListEntryVO.class).select(AccessControlListEntryVO_.matchMethod).eq(AccessControlListEntryVO_.uuid, rule.getRedirectRuleUuid()).findValue();
boolean isSkipInsertPort = ( LoadBalancerConstants.MatchMethod.Domain.toString().equals(matchMethod) || LoadBalancerConstants.MatchMethod.Url.toString().equals(matchMethod) );
if ( isSkipInsertPort && isDefaultPort ){
continue;
} else if( isSkipInsertPort){
formatRedirectRules.add(formatRule);
} else{
insertPortToRedirectRule(formatRule, lbTO);
formatRedirectRules.add(formatRule);
}
}
return formatRedirectRules;
}

private void formatRedirectRule(LbTO.RedirectRule redirectRule,LbTO lbTO){
private void insertPortToRedirectRule(LbTO.RedirectRule redirectRule,LbTO lbTO){
//add lbport after domain name
StringBuffer rule = new StringBuffer(redirectRule.getRedirectRule());
String insertRule = ":" + lbTO.getLoadBalancerPort();
int index = rule.indexOf("/");
Expand Down
Expand Up @@ -172,6 +172,7 @@ class LoadBalancerRedirectRuleCase extends SubCase {
dbf = bean(DatabaseFacade.class)
env.create {
testRulePort()
testOnlyUrlOrDomain()
}
}

Expand Down Expand Up @@ -241,6 +242,111 @@ class LoadBalancerRedirectRuleCase extends SubCase {
deleteAccessControlList {
uuid = acl1.uuid
}

deleteLoadBalancerListener {
uuid = lbl.uuid
}
}

void testOnlyUrlOrDomain(){
def load = env.inventoryByName("lb") as LoadBalancerInventory
def vm = env.inventoryByName("vm") as VmInstanceInventory
def l3 = env.inventoryByName("l3") as L3NetworkInventory

VirtualRouterLoadBalancerBackend.RefreshLbCmd cmd = null
env.afterSimulator(VirtualRouterLoadBalancerBackend.REFRESH_LB_PATH) { rsp, HttpEntity<String> e ->
cmd = JSONObjectUtil.toObject(e.body, VirtualRouterLoadBalancerBackend.RefreshLbCmd.class)
return rsp
}

LoadBalancerListenerInventory lbl = createLoadBalancerListener {
protocol = LoadBalancerConstants.LB_PROTOCOL_HTTP
loadBalancerUuid = load.uuid
loadBalancerPort = 8093
instancePort = 80
name = "test-listener"
}

LoadBalancerServerGroupInventory sg1 = createLoadBalancerServerGroup{
loadBalancerUuid = load.uuid
name = "sg1"
}

addServerGroupToLoadBalancerListener {
listenerUuid = lbl.uuid
serverGroupUuid = sg1.uuid
}


AccessControlListInventory acl1 = createAccessControlList {
name = "acl1"
}

AccessControlListEntryInventory redirectRule1 = addAccessControlListRedirectRule {
name = "redirect rule"
domain = ""
url = "/test"
aclUuid = acl1.uuid
}

addAccessControlListToLoadBalancer {
aclUuids = [acl1.uuid]
aclType = "redirect"
listenerUuid = lbl.uuid
serverGroupUuids = [sg1.uuid]
}

VmNicInventory nic1 = vm.vmNics.get(0)

addBackendServerToServerGroup {
vmNics = [['uuid':nic1.uuid,'weight':'10']]
serverGroupUuid = sg1.uuid
}

def lbTO = cmd.lbs.stream().filter{lb -> lb.listenerUuid.equals(lbl.uuid)}.collect(Collectors.toList())[0] as VirtualRouterLoadBalancerBackend.LbTO
def redirectRules= lbTO.redirectRules.stream().filter{ it -> it.getServerGroupUuid().equals(sg1.uuid)}.collect(Collectors.toList())
assert redirectRules.size == 1
assert redirectRules[0].redirectRule.contains("path")
assert !redirectRules[0].redirectRule.contains(":8093")

deleteAccessControlList {
uuid = acl1.uuid
}


AccessControlListInventory acl2 = createAccessControlList {
name = "acl2"
}

AccessControlListEntryInventory redirectRule2 = addAccessControlListRedirectRule {
name = "redirect rule"
domain = "zstack.io"
url = ""
aclUuid = acl2.uuid
}

addAccessControlListToLoadBalancer {
aclUuids = [acl2.uuid]
aclType = "redirect"
listenerUuid = lbl.uuid
serverGroupUuids = [sg1.uuid]
}

def lbTO2 = cmd.lbs.stream().filter{lb -> lb.listenerUuid.equals(lbl.uuid)}.collect(Collectors.toList())[0] as VirtualRouterLoadBalancerBackend.LbTO
redirectRules = lbTO2.redirectRules.stream().filter{ it -> it.getServerGroupUuid().equals(sg1.uuid)}.collect(Collectors.toList())
assert redirectRules.size == 1
assert redirectRules[0].redirectRule.contains("hdr")
assert !redirectRules[0].redirectRule.contains(":8093")

deleteAccessControlList {
uuid = acl2.uuid
}


deleteLoadBalancerListener {
uuid = lbl.uuid
}
}

}

0 comments on commit aba63f8

Please sign in to comment.