// // Licensed to the Apache Software Foundation (ASF) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The ASF licenses this file // to you 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 com.cloud.agent.resource.virtualnetwork; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.List; import java.util.UUID; import org.junit.Test; import com.google.gson.FieldNamingPolicy; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.cloud.agent.api.routing.DeleteIpAliasCommand; import com.cloud.agent.api.routing.DnsMasqConfigCommand; import com.cloud.agent.api.routing.IpAliasTO; import com.cloud.agent.api.routing.IpAssocVpcCommand; import com.cloud.agent.api.routing.LoadBalancerConfigCommand; import com.cloud.agent.api.routing.NetworkElementCommand; import com.cloud.agent.api.routing.SetPortForwardingRulesVpcCommand; import com.cloud.agent.api.to.DhcpTO; import com.cloud.agent.api.to.IpAddressTO; import com.cloud.agent.api.to.LoadBalancerTO; import com.cloud.agent.api.to.NicTO; import com.cloud.agent.api.to.PortForwardingRuleTO; import com.cloud.agent.resource.virtualnetwork.facade.AbstractConfigItemFacade; import com.cloud.agent.resource.virtualnetwork.model.DhcpConfig; import com.cloud.agent.resource.virtualnetwork.model.DhcpConfigEntry; import com.cloud.agent.resource.virtualnetwork.model.ForwardingRule; import com.cloud.agent.resource.virtualnetwork.model.ForwardingRules; import com.cloud.agent.resource.virtualnetwork.model.IpAddress; import com.cloud.agent.resource.virtualnetwork.model.IpAddressAlias; import com.cloud.agent.resource.virtualnetwork.model.IpAliases; import com.cloud.agent.resource.virtualnetwork.model.IpAssociation; import com.cloud.agent.resource.virtualnetwork.model.LoadBalancerRule; import com.cloud.agent.resource.virtualnetwork.model.LoadBalancerRules; import com.cloud.network.lb.LoadBalancingRule.LbDestination; import com.cloud.network.Networks.TrafficType; public class ConfigHelperTest { private final static Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create(); private final String ROUTERNAME = "r-4-VM"; @Test public void testGenerateCommandCfgLoadBalancer() { final LoadBalancerConfigCommand command = generateLoadBalancerConfigCommand(); final AbstractConfigItemFacade configItemFacade = AbstractConfigItemFacade.getInstance(command.getClass()); final List<ConfigItem> config = configItemFacade.generateConfig(command); assertTrue(config.size() > 0); final ConfigItem fileConfig = config.get(0); assertNotNull(fileConfig); assertTrue(fileConfig instanceof FileConfigItem); final String fileContents = ((FileConfigItem)fileConfig).getFileContents(); assertNotNull(fileContents); final LoadBalancerRules jsonClass = gson.fromJson(fileContents, LoadBalancerRules.class); assertNotNull(jsonClass); assertEquals(jsonClass.getType(), "loadbalancer"); final List<LoadBalancerRule> rules = jsonClass.getRules(); assertNotNull(rules); assertTrue(rules.size() == 1); assertEquals(rules.get(0).getRouterIp(), "10.1.10.2"); final ConfigItem scriptConfig = config.get(1); assertNotNull(scriptConfig); assertTrue(scriptConfig instanceof ScriptConfigItem); } @Test public void testSetPortForwardingRulesVpc() { final SetPortForwardingRulesVpcCommand command = generateSetPortForwardingRulesVpcCommand(); final AbstractConfigItemFacade configItemFacade = AbstractConfigItemFacade.getInstance(command.getClass()); final List<ConfigItem> config = configItemFacade.generateConfig(command); assertTrue(config.size() > 0); final ConfigItem fileConfig = config.get(0); assertNotNull(fileConfig); assertTrue(fileConfig instanceof FileConfigItem); final String fileContents = ((FileConfigItem)fileConfig).getFileContents(); assertNotNull(fileContents); final ForwardingRules jsonClass = gson.fromJson(fileContents, ForwardingRules.class); assertNotNull(jsonClass); assertEquals(jsonClass.getType(), "forwardrules"); final ForwardingRule [] rules = jsonClass.getRules(); assertNotNull(rules); assertTrue(rules.length == 2); assertEquals(rules[0].getSourceIpAddress(), "64.1.1.10"); final ConfigItem scriptConfig = config.get(1); assertNotNull(scriptConfig); assertTrue(scriptConfig instanceof ScriptConfigItem); } @Test public void testIpAssocVpc() { final IpAssocVpcCommand command = generateIpAssocVpcCommand(); final AbstractConfigItemFacade configItemFacade = AbstractConfigItemFacade.getInstance(command.getClass()); final List<ConfigItem> config = configItemFacade.generateConfig(command); assertTrue(config.size() > 0); final ConfigItem fileConfig = config.get(0); assertNotNull(fileConfig); assertTrue(fileConfig instanceof FileConfigItem); final String fileContents = ((FileConfigItem)fileConfig).getFileContents(); assertNotNull(fileContents); final IpAssociation jsonClass = gson.fromJson(fileContents, IpAssociation.class); assertNotNull(jsonClass); assertEquals(jsonClass.getType(), "ips"); final IpAddress [] ips = jsonClass.getIpAddress(); assertNotNull(ips); assertTrue(ips.length == 3); assertEquals(ips[0].getPublicIp(), "64.1.1.10"); final ConfigItem scriptConfig = config.get(1); assertNotNull(scriptConfig); assertTrue(scriptConfig instanceof ScriptConfigItem); } @Test public void testDnsMasqConfig() { final DnsMasqConfigCommand command = generateDnsMasqConfigCommand(); final AbstractConfigItemFacade configItemFacade = AbstractConfigItemFacade.getInstance(command.getClass()); final List<ConfigItem> config = configItemFacade.generateConfig(command); assertTrue(config.size() > 0); final ConfigItem fileConfig = config.get(0); assertNotNull(fileConfig); assertTrue(fileConfig instanceof FileConfigItem); final String fileContents = ((FileConfigItem)fileConfig).getFileContents(); assertNotNull(fileContents); final DhcpConfig jsonClass = gson.fromJson(fileContents, DhcpConfig.class); assertNotNull(jsonClass); assertEquals(jsonClass.getType(), "dhcpconfig"); final List<DhcpConfigEntry> entries = jsonClass.getEntries(); assertNotNull(entries); assertTrue(entries.size() == 2); assertEquals(entries.get(0).getRouterIpAddress(), "10.1.20.2"); final ConfigItem scriptConfig = config.get(1); assertNotNull(scriptConfig); assertTrue(scriptConfig instanceof ScriptConfigItem); } @Test public void testDeleteIpAlias() { final DeleteIpAliasCommand command = generateDeleteIpAliasCommand(); final AbstractConfigItemFacade configItemFacade = AbstractConfigItemFacade.getInstance(command.getClass()); final List<ConfigItem> config = configItemFacade.generateConfig(command); assertTrue(config.size() > 0); final ConfigItem fileConfig = config.get(0); assertNotNull(fileConfig); assertTrue(fileConfig instanceof FileConfigItem); final String fileContents = ((FileConfigItem)fileConfig).getFileContents(); assertNotNull(fileContents); final IpAliases jsonClass = gson.fromJson(fileContents, IpAliases.class); assertNotNull(jsonClass); assertEquals(jsonClass.getType(), "ipaliases"); final List<IpAddressAlias> aliases = jsonClass.getAliases(); assertNotNull(aliases); assertTrue(aliases.size() == 6); assertEquals(aliases.get(0).getIpAddress(), "169.254.3.10"); final ConfigItem scriptConfig = config.get(1); assertNotNull(scriptConfig); assertTrue(scriptConfig instanceof ScriptConfigItem); } protected LoadBalancerConfigCommand generateLoadBalancerConfigCommand() { final List<LoadBalancerTO> lbs = new ArrayList<>(); final List<LbDestination> dests = new ArrayList<>(); dests.add(new LbDestination(80, 8080, "10.1.10.2", false)); dests.add(new LbDestination(80, 8080, "10.1.10.2", true)); lbs.add(new LoadBalancerTO(UUID.randomUUID().toString(), "64.10.1.10", 80, "tcp", "algo", false, false, false, dests)); final LoadBalancerTO[] arrayLbs = new LoadBalancerTO[lbs.size()]; lbs.toArray(arrayLbs); final NicTO nic = new NicTO(); final LoadBalancerConfigCommand cmd = new LoadBalancerConfigCommand(arrayLbs, "64.10.2.10", "10.1.10.2", "192.168.1.2", nic, null, "1000", false); cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, "10.1.10.2"); cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, ROUTERNAME); return cmd; } protected SetPortForwardingRulesVpcCommand generateSetPortForwardingRulesVpcCommand() { final List<PortForwardingRuleTO> pfRules = new ArrayList<>(); pfRules.add(new PortForwardingRuleTO(1, "64.1.1.10", 22, 80, "10.10.1.10", 22, 80, "TCP", false, false)); pfRules.add(new PortForwardingRuleTO(2, "64.1.1.11", 8080, 8080, "10.10.1.11", 8080, 8080, "UDP", true, false)); final SetPortForwardingRulesVpcCommand cmd = new SetPortForwardingRulesVpcCommand(pfRules); cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, ROUTERNAME); assertEquals(cmd.getAnswersCount(), 2); return cmd; } protected DnsMasqConfigCommand generateDnsMasqConfigCommand() { final List<DhcpTO> dhcps = new ArrayList<>(); dhcps.add(new DhcpTO("10.1.20.2", "10.1.20.1", "255.255.255.0", "10.1.20.5")); dhcps.add(new DhcpTO("10.1.21.2", "10.1.21.1", "255.255.255.0", "10.1.21.5")); final DnsMasqConfigCommand cmd = new DnsMasqConfigCommand(dhcps); cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, ROUTERNAME); return cmd; } protected DeleteIpAliasCommand generateDeleteIpAliasCommand() { final List<IpAliasTO> aliases = new ArrayList<>(); aliases.add(new IpAliasTO("169.254.3.10", "255.255.255.0", "1")); aliases.add(new IpAliasTO("169.254.3.11", "255.255.255.0", "2")); aliases.add(new IpAliasTO("169.254.3.12", "255.255.255.0", "3")); final DeleteIpAliasCommand cmd = new DeleteIpAliasCommand("169.254.10.1", aliases, aliases); cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, ROUTERNAME); return cmd; } protected IpAssocVpcCommand generateIpAssocVpcCommand() { final List<IpAddressTO> ips = new ArrayList<IpAddressTO>(); IpAddressTO ip1 = new IpAddressTO(1, "64.1.1.10", true, true, true, "vlan://64", "64.1.1.1", "255.255.255.0", "01:23:45:67:89:AB", 1000, false); IpAddressTO ip2 = new IpAddressTO(2, "64.1.1.11", false, false, true, "vlan://64", "64.1.1.1", "255.255.255.0", "01:23:45:67:89:AB", 1000, false); IpAddressTO ip3 = new IpAddressTO(3, "65.1.1.11", true, false, false, "vlan://65", "65.1.1.1", "255.255.255.0", "11:23:45:67:89:AB", 1000, false); ip1.setTrafficType(TrafficType.Public); ip2.setTrafficType(TrafficType.Public); ip3.setTrafficType(TrafficType.Public); ips.add(ip1); ips.add(ip2); ips.add(ip3); final IpAddressTO[] ipArray = ips.toArray(new IpAddressTO[ips.size()]); final IpAssocVpcCommand cmd = new IpAssocVpcCommand(ipArray); cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, ROUTERNAME); assertEquals(6, cmd.getAnswersCount()); // AnswersCount is clearly wrong as it doesn't know enough to tell return cmd; } }