mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
CLOUDSTACK-6047: Introduce Aggregated commands queue to VR
This commit is contained in:
parent
7cb913235a
commit
60dc25450a
@ -0,0 +1,31 @@
|
|||||||
|
// 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.api.routing;
|
||||||
|
|
||||||
|
public class FinishAggregationCommand extends NetworkElementCommand{
|
||||||
|
protected FinishAggregationCommand() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public FinishAggregationCommand(String name, String ip, String guestIp) {
|
||||||
|
super();
|
||||||
|
this.setAccessDetail(NetworkElementCommand.ROUTER_NAME, name);
|
||||||
|
this.setAccessDetail(NetworkElementCommand.ROUTER_IP, ip);
|
||||||
|
this.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, guestIp);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,31 @@
|
|||||||
|
// 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.api.routing;
|
||||||
|
|
||||||
|
public class StartAggregationCommand extends NetworkElementCommand{
|
||||||
|
protected StartAggregationCommand() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public StartAggregationCommand(String name, String ip, String guestIp) {
|
||||||
|
super();
|
||||||
|
this.setAccessDetail(NetworkElementCommand.ROUTER_NAME, name);
|
||||||
|
this.setAccessDetail(NetworkElementCommand.ROUTER_IP, ip);
|
||||||
|
this.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, guestIp);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -29,6 +29,7 @@ import com.cloud.agent.api.routing.CreateIpAliasCommand;
|
|||||||
import com.cloud.agent.api.routing.DeleteIpAliasCommand;
|
import com.cloud.agent.api.routing.DeleteIpAliasCommand;
|
||||||
import com.cloud.agent.api.routing.DhcpEntryCommand;
|
import com.cloud.agent.api.routing.DhcpEntryCommand;
|
||||||
import com.cloud.agent.api.routing.DnsMasqConfigCommand;
|
import com.cloud.agent.api.routing.DnsMasqConfigCommand;
|
||||||
|
import com.cloud.agent.api.routing.FinishAggregationCommand;
|
||||||
import com.cloud.agent.api.routing.GroupAnswer;
|
import com.cloud.agent.api.routing.GroupAnswer;
|
||||||
import com.cloud.agent.api.routing.IpAliasTO;
|
import com.cloud.agent.api.routing.IpAliasTO;
|
||||||
import com.cloud.agent.api.routing.IpAssocCommand;
|
import com.cloud.agent.api.routing.IpAssocCommand;
|
||||||
@ -46,6 +47,7 @@ import com.cloud.agent.api.routing.SetSourceNatCommand;
|
|||||||
import com.cloud.agent.api.routing.SetStaticNatRulesCommand;
|
import com.cloud.agent.api.routing.SetStaticNatRulesCommand;
|
||||||
import com.cloud.agent.api.routing.SetStaticRouteCommand;
|
import com.cloud.agent.api.routing.SetStaticRouteCommand;
|
||||||
import com.cloud.agent.api.routing.Site2SiteVpnCfgCommand;
|
import com.cloud.agent.api.routing.Site2SiteVpnCfgCommand;
|
||||||
|
import com.cloud.agent.api.routing.StartAggregationCommand;
|
||||||
import com.cloud.agent.api.routing.VmDataCommand;
|
import com.cloud.agent.api.routing.VmDataCommand;
|
||||||
import com.cloud.agent.api.routing.VpnUsersCfgCommand;
|
import com.cloud.agent.api.routing.VpnUsersCfgCommand;
|
||||||
import com.cloud.agent.api.to.DhcpTO;
|
import com.cloud.agent.api.to.DhcpTO;
|
||||||
@ -72,6 +74,9 @@ import java.util.HashMap;
|
|||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Queue;
|
||||||
|
import java.util.UUID;
|
||||||
|
import java.util.concurrent.LinkedBlockingQueue;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* VirtualNetworkResource controls and configures virtual networking
|
* VirtualNetworkResource controls and configures virtual networking
|
||||||
@ -111,27 +116,34 @@ public class VirtualRoutingResource {
|
|||||||
protected static final String VPC_STATIC_NAT = "vpc_staticnat.sh";
|
protected static final String VPC_STATIC_NAT = "vpc_staticnat.sh";
|
||||||
protected static final String VPC_STATIC_ROUTE = "vpc_staticroute.sh";
|
protected static final String VPC_STATIC_ROUTE = "vpc_staticroute.sh";
|
||||||
protected static final String VPN_L2TP = "vpn_l2tp.sh";
|
protected static final String VPN_L2TP = "vpn_l2tp.sh";
|
||||||
|
|
||||||
|
protected static final String VR_CFG = "vr_cfg.sh";
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final Logger s_logger = Logger.getLogger(VirtualRoutingResource.class);
|
private static final Logger s_logger = Logger.getLogger(VirtualRoutingResource.class);
|
||||||
private VirtualRouterDeployer _vrDeployer;
|
private VirtualRouterDeployer _vrDeployer;
|
||||||
|
private Map <String, Queue> _vrAggregateCommandsSet;
|
||||||
|
|
||||||
private String _name;
|
private String _name;
|
||||||
private int _sleep;
|
private int _sleep;
|
||||||
private int _retry;
|
private int _retry;
|
||||||
private int _port;
|
private int _port;
|
||||||
|
|
||||||
|
private String _cfgVersion = "1.0";
|
||||||
|
|
||||||
public VirtualRoutingResource(VirtualRouterDeployer deployer) {
|
public VirtualRoutingResource(VirtualRouterDeployer deployer) {
|
||||||
this._vrDeployer = deployer;
|
this._vrDeployer = deployer;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Answer executeRequest(final NetworkElementCommand cmd) {
|
public Answer executeRequest(final NetworkElementCommand cmd) {
|
||||||
|
boolean aggregated = false;
|
||||||
try {
|
try {
|
||||||
ExecutionResult rc = _vrDeployer.prepareCommand(cmd);
|
ExecutionResult rc = _vrDeployer.prepareCommand(cmd);
|
||||||
if (!rc.isSuccess()) {
|
if (!rc.isSuccess()) {
|
||||||
s_logger.error("Failed to prepare VR command due to " + rc.getDetails());
|
s_logger.error("Failed to prepare VR command due to " + rc.getDetails());
|
||||||
return new Answer(cmd, false, rc.getDetails());
|
return new Answer(cmd, false, rc.getDetails());
|
||||||
}
|
}
|
||||||
|
String routerName = cmd.getAccessDetail(NetworkElementCommand.ROUTER_NAME);
|
||||||
|
|
||||||
assert cmd.getRouterAccessIp() != null : "Why there is no access IP for VR?";
|
assert cmd.getRouterAccessIp() != null : "Why there is no access IP for VR?";
|
||||||
|
|
||||||
@ -139,50 +151,22 @@ public class VirtualRoutingResource {
|
|||||||
return executeQueryCommand(cmd);
|
return executeQueryCommand(cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
List<ConfigItem> cfg;
|
if (cmd instanceof StartAggregationCommand) {
|
||||||
if (cmd instanceof SetPortForwardingRulesVpcCommand) {
|
return execute((StartAggregationCommand)cmd);
|
||||||
cfg = generateConfig((SetPortForwardingRulesVpcCommand)cmd);
|
} else if (cmd instanceof FinishAggregationCommand) {
|
||||||
} else if (cmd instanceof SetPortForwardingRulesCommand) {
|
return execute((FinishAggregationCommand)cmd);
|
||||||
cfg = generateConfig((SetPortForwardingRulesCommand)cmd);
|
}
|
||||||
} else if (cmd instanceof SetStaticRouteCommand) {
|
|
||||||
cfg = generateConfig((SetStaticRouteCommand)cmd);
|
if (_vrAggregateCommandsSet.containsKey(routerName)) {
|
||||||
} else if (cmd instanceof SetStaticNatRulesCommand) {
|
_vrAggregateCommandsSet.get(routerName).add(cmd);
|
||||||
cfg = generateConfig((SetStaticNatRulesCommand)cmd);
|
aggregated = true;
|
||||||
} else if (cmd instanceof LoadBalancerConfigCommand) {
|
// Clean up would be done after command has been executed
|
||||||
cfg = generateConfig((LoadBalancerConfigCommand)cmd);
|
//TODO: Deal with group answer as well
|
||||||
} else if (cmd instanceof SavePasswordCommand) {
|
return new Answer(cmd);
|
||||||
cfg = generateConfig((SavePasswordCommand)cmd);
|
}
|
||||||
} else if (cmd instanceof DhcpEntryCommand) {
|
|
||||||
cfg = generateConfig((DhcpEntryCommand)cmd);
|
List<ConfigItem> cfg = generateCommandCfg(cmd);
|
||||||
} else if (cmd instanceof CreateIpAliasCommand) {
|
if (cfg == null) {
|
||||||
cfg = generateConfig((CreateIpAliasCommand)cmd);
|
|
||||||
} else if (cmd instanceof DnsMasqConfigCommand) {
|
|
||||||
cfg = generateConfig((DnsMasqConfigCommand)cmd);
|
|
||||||
} else if (cmd instanceof DeleteIpAliasCommand) {
|
|
||||||
cfg = generateConfig((DeleteIpAliasCommand)cmd);
|
|
||||||
} else if (cmd instanceof VmDataCommand) {
|
|
||||||
cfg = generateConfig((VmDataCommand)cmd);
|
|
||||||
} else if (cmd instanceof SetFirewallRulesCommand) {
|
|
||||||
cfg = generateConfig((SetFirewallRulesCommand)cmd);
|
|
||||||
} else if (cmd instanceof BumpUpPriorityCommand) {
|
|
||||||
cfg = generateConfig((BumpUpPriorityCommand)cmd);
|
|
||||||
} else if (cmd instanceof RemoteAccessVpnCfgCommand) {
|
|
||||||
cfg = generateConfig((RemoteAccessVpnCfgCommand)cmd);
|
|
||||||
} else if (cmd instanceof VpnUsersCfgCommand) {
|
|
||||||
cfg = generateConfig((VpnUsersCfgCommand)cmd);
|
|
||||||
} else if (cmd instanceof Site2SiteVpnCfgCommand) {
|
|
||||||
cfg = generateConfig((Site2SiteVpnCfgCommand)cmd);
|
|
||||||
} else if (cmd instanceof SetMonitorServiceCommand) {
|
|
||||||
cfg = generateConfig((SetMonitorServiceCommand)cmd);
|
|
||||||
} else if (cmd instanceof SetupGuestNetworkCommand) {
|
|
||||||
cfg = generateConfig((SetupGuestNetworkCommand)cmd);
|
|
||||||
} else if (cmd instanceof SetNetworkACLCommand) {
|
|
||||||
cfg = generateConfig((SetNetworkACLCommand)cmd);
|
|
||||||
} else if (cmd instanceof SetSourceNatCommand) {
|
|
||||||
cfg = generateConfig((SetSourceNatCommand)cmd);
|
|
||||||
} else if (cmd instanceof IpAssocCommand) {
|
|
||||||
cfg = generateConfig((IpAssocCommand)cmd);
|
|
||||||
} else {
|
|
||||||
return Answer.createUnsupportedCommandAnswer(cmd);
|
return Answer.createUnsupportedCommandAnswer(cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -190,12 +174,14 @@ public class VirtualRoutingResource {
|
|||||||
} catch (final IllegalArgumentException e) {
|
} catch (final IllegalArgumentException e) {
|
||||||
return new Answer(cmd, false, e.getMessage());
|
return new Answer(cmd, false, e.getMessage());
|
||||||
} finally {
|
} finally {
|
||||||
|
if (!aggregated) {
|
||||||
ExecutionResult rc = _vrDeployer.cleanupCommand(cmd);
|
ExecutionResult rc = _vrDeployer.cleanupCommand(cmd);
|
||||||
if (!rc.isSuccess()) {
|
if (!rc.isSuccess()) {
|
||||||
s_logger.error("Failed to cleanup VR command due to " + rc.getDetails());
|
s_logger.error("Failed to cleanup VR command due to " + rc.getDetails());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected class ConfigItem {
|
protected class ConfigItem {
|
||||||
private String script;
|
private String script;
|
||||||
@ -952,6 +938,8 @@ public class VirtualRoutingResource {
|
|||||||
if (_vrDeployer == null) {
|
if (_vrDeployer == null) {
|
||||||
throw new ConfigurationException("Unable to find the resource for VirtualRouterDeployer!");
|
throw new ConfigurationException("Unable to find the resource for VirtualRouterDeployer!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_vrAggregateCommandsSet = new HashMap<>();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1030,4 +1018,110 @@ public class VirtualRoutingResource {
|
|||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Answer execute(StartAggregationCommand cmd) {
|
||||||
|
// Access IP would be used as ID for router
|
||||||
|
String routerName = cmd.getAccessDetail(NetworkElementCommand.ROUTER_NAME);
|
||||||
|
assert routerName != null;
|
||||||
|
Queue<NetworkElementCommand> queue = new LinkedBlockingQueue<>();
|
||||||
|
_vrAggregateCommandsSet.put(routerName, queue);
|
||||||
|
return new Answer(cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<ConfigItem> generateCommandCfg(NetworkElementCommand cmd) {
|
||||||
|
List<ConfigItem> cfg;
|
||||||
|
if (cmd instanceof SetPortForwardingRulesVpcCommand) {
|
||||||
|
cfg = generateConfig((SetPortForwardingRulesVpcCommand)cmd);
|
||||||
|
} else if (cmd instanceof SetPortForwardingRulesCommand) {
|
||||||
|
cfg = generateConfig((SetPortForwardingRulesCommand)cmd);
|
||||||
|
} else if (cmd instanceof SetStaticRouteCommand) {
|
||||||
|
cfg = generateConfig((SetStaticRouteCommand)cmd);
|
||||||
|
} else if (cmd instanceof SetStaticNatRulesCommand) {
|
||||||
|
cfg = generateConfig((SetStaticNatRulesCommand)cmd);
|
||||||
|
} else if (cmd instanceof LoadBalancerConfigCommand) {
|
||||||
|
cfg = generateConfig((LoadBalancerConfigCommand)cmd);
|
||||||
|
} else if (cmd instanceof SavePasswordCommand) {
|
||||||
|
cfg = generateConfig((SavePasswordCommand)cmd);
|
||||||
|
} else if (cmd instanceof DhcpEntryCommand) {
|
||||||
|
cfg = generateConfig((DhcpEntryCommand)cmd);
|
||||||
|
} else if (cmd instanceof CreateIpAliasCommand) {
|
||||||
|
cfg = generateConfig((CreateIpAliasCommand)cmd);
|
||||||
|
} else if (cmd instanceof DnsMasqConfigCommand) {
|
||||||
|
cfg = generateConfig((DnsMasqConfigCommand)cmd);
|
||||||
|
} else if (cmd instanceof DeleteIpAliasCommand) {
|
||||||
|
cfg = generateConfig((DeleteIpAliasCommand)cmd);
|
||||||
|
} else if (cmd instanceof VmDataCommand) {
|
||||||
|
cfg = generateConfig((VmDataCommand)cmd);
|
||||||
|
} else if (cmd instanceof SetFirewallRulesCommand) {
|
||||||
|
cfg = generateConfig((SetFirewallRulesCommand)cmd);
|
||||||
|
} else if (cmd instanceof BumpUpPriorityCommand) {
|
||||||
|
cfg = generateConfig((BumpUpPriorityCommand)cmd);
|
||||||
|
} else if (cmd instanceof RemoteAccessVpnCfgCommand) {
|
||||||
|
cfg = generateConfig((RemoteAccessVpnCfgCommand)cmd);
|
||||||
|
} else if (cmd instanceof VpnUsersCfgCommand) {
|
||||||
|
cfg = generateConfig((VpnUsersCfgCommand)cmd);
|
||||||
|
} else if (cmd instanceof Site2SiteVpnCfgCommand) {
|
||||||
|
cfg = generateConfig((Site2SiteVpnCfgCommand)cmd);
|
||||||
|
} else if (cmd instanceof SetMonitorServiceCommand) {
|
||||||
|
cfg = generateConfig((SetMonitorServiceCommand)cmd);
|
||||||
|
} else if (cmd instanceof SetupGuestNetworkCommand) {
|
||||||
|
cfg = generateConfig((SetupGuestNetworkCommand)cmd);
|
||||||
|
} else if (cmd instanceof SetNetworkACLCommand) {
|
||||||
|
cfg = generateConfig((SetNetworkACLCommand)cmd);
|
||||||
|
} else if (cmd instanceof SetSourceNatCommand) {
|
||||||
|
cfg = generateConfig((SetSourceNatCommand)cmd);
|
||||||
|
} else if (cmd instanceof IpAssocCommand) {
|
||||||
|
cfg = generateConfig((IpAssocCommand)cmd);
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return cfg;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Answer execute(FinishAggregationCommand cmd) {
|
||||||
|
String routerName = cmd.getAccessDetail(NetworkElementCommand.ROUTER_NAME);
|
||||||
|
assert routerName != null;
|
||||||
|
assert cmd.getRouterAccessIp() != null;
|
||||||
|
Queue<NetworkElementCommand> queue = _vrAggregateCommandsSet.get(routerName);
|
||||||
|
try {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
sb.append("#Apache CloudStack Virtual Router Config File\n");
|
||||||
|
sb.append("<version>\n" + _cfgVersion + "\n</version>\n");
|
||||||
|
for (NetworkElementCommand command : queue) {
|
||||||
|
List<ConfigItem> cfg = generateCommandCfg(command);
|
||||||
|
if (cfg == null) {
|
||||||
|
s_logger.warn("Unknown commands for VirtualRoutingResource, but continue: " + cmd.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
for (ConfigItem c : cfg) {
|
||||||
|
if (c.isFile()) {
|
||||||
|
sb.append("<file>\n");
|
||||||
|
sb.append(c.getFilePath() + c.getFileName() + "\n");
|
||||||
|
sb.append(c.getFileContents() + "\n");
|
||||||
|
sb.append("</file>\n");
|
||||||
|
} else {
|
||||||
|
sb.append("<script>\n");
|
||||||
|
sb.append("/opt/cloud/bin/" + c.getScript() + " " + c.getArgs() + "\n");
|
||||||
|
sb.append("</script>\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
String cfgFilePath = "/var/cache/cloud/";
|
||||||
|
String cfgFileName = "VR-"+ UUID.randomUUID().toString() + ".cfg";
|
||||||
|
ExecutionResult result = _vrDeployer.createFileInVR(cmd.getRouterAccessIp(), cfgFilePath, cfgFileName, sb.toString());
|
||||||
|
if (!result.isSuccess()) {
|
||||||
|
return new Answer(cmd, false, result.getDetails());
|
||||||
|
}
|
||||||
|
|
||||||
|
result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), VRScripts.VR_CFG, "-c " + cfgFilePath + cfgFileName);
|
||||||
|
if (!result.isSuccess()) {
|
||||||
|
return new Answer(cmd, false, result.getDetails());
|
||||||
|
}
|
||||||
|
return new Answer(cmd);
|
||||||
|
} finally {
|
||||||
|
queue.clear();
|
||||||
|
_vrAggregateCommandsSet.remove(routerName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2736,12 +2736,10 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
|
|||||||
final Commands cmds = new Commands(Command.OnError.Stop);
|
final Commands cmds = new Commands(Command.OnError.Stop);
|
||||||
createApplyVpnCommands(true, vpn, router, cmds);
|
createApplyVpnCommands(true, vpn, router, cmds);
|
||||||
|
|
||||||
try {
|
if (!sendCommandsToRouter(router, cmds)) {
|
||||||
_agentMgr.send(router.getHostId(), cmds);
|
throw new AgentUnavailableException("Unable to send commands to virtual router ", router.getHostId());
|
||||||
} catch (final OperationTimedoutException e) {
|
|
||||||
s_logger.debug("Failed to start remote access VPN: ", e);
|
|
||||||
throw new AgentUnavailableException("Unable to send commands to virtual router ", router.getHostId(), e);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Answer answer = cmds.getAnswer("users");
|
Answer answer = cmds.getAnswer("users");
|
||||||
if (!answer.getResult()) {
|
if (!answer.getResult()) {
|
||||||
s_logger.error("Unable to start vpn: unable add users to vpn in zone " + router.getDataCenterId() + " for account " + vpn.getAccountId() + " on domR: " +
|
s_logger.error("Unable to start vpn: unable add users to vpn in zone " + router.getDataCenterId() + " for account " + vpn.getAccountId() + " on domR: " +
|
||||||
|
|||||||
96
systemvm/patches/debian/config/opt/cloud/bin/vr_cfg.sh
Executable file
96
systemvm/patches/debian/config/opt/cloud/bin/vr_cfg.sh
Executable file
@ -0,0 +1,96 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
#set -x
|
||||||
|
|
||||||
|
cfg=
|
||||||
|
version=
|
||||||
|
log=/var/log/cloud.log
|
||||||
|
|
||||||
|
log_it() {
|
||||||
|
logger -t cloud "$*"
|
||||||
|
echo "$(date) : $*" >> $log
|
||||||
|
}
|
||||||
|
|
||||||
|
while getopts 'c:' OPTION
|
||||||
|
do
|
||||||
|
case $OPTION in
|
||||||
|
c) cfg="$OPTARG"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
while read line
|
||||||
|
do
|
||||||
|
#comment
|
||||||
|
if [[ $line == \#* ]]
|
||||||
|
then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$line" == "<version>" ]
|
||||||
|
then
|
||||||
|
read line
|
||||||
|
version=$line
|
||||||
|
log_it "VR config: configuation format version $version"
|
||||||
|
#skip </version>
|
||||||
|
read line
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$line" == "<script>" ]
|
||||||
|
then
|
||||||
|
read line
|
||||||
|
log_it "VR config: executing: $line"
|
||||||
|
eval $line >> $log 2>&1
|
||||||
|
if [ $? -ne 0 ]
|
||||||
|
then
|
||||||
|
log_it "VR config: executing failed: $line"
|
||||||
|
# expose error info to mgmt server
|
||||||
|
echo "VR config: execution failed: \"$line\", check $log in VR for details "
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
#skip </script>
|
||||||
|
read line
|
||||||
|
log_it "VR config: execution success "
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$line" == "<file>" ]
|
||||||
|
then
|
||||||
|
read line
|
||||||
|
file=$line
|
||||||
|
log_it "VR config: creating file: $file"
|
||||||
|
rm -f $file
|
||||||
|
while read line
|
||||||
|
do
|
||||||
|
if [ "$line" == "</file>" ]
|
||||||
|
then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
echo $line >> $file
|
||||||
|
done
|
||||||
|
log_it "VR config: create file success"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
done < $cfg
|
||||||
|
|
||||||
|
#remove the configuration file, log file should have all the records as well
|
||||||
|
rm -f $cfg
|
||||||
|
|
||||||
|
exit 0
|
||||||
Loading…
x
Reference in New Issue
Block a user