blob: bed472b68808268492928af4f9dece06bb456b51 [file] [log] [blame]
//
// 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.facade;
import java.util.Hashtable;
import java.util.LinkedList;
import java.util.List;
import java.util.UUID;
import org.apache.log4j.Logger;
import com.cloud.agent.api.BumpUpPriorityCommand;
import com.cloud.agent.api.SetupGuestNetworkCommand;
import com.cloud.agent.api.routing.CreateIpAliasCommand;
import com.cloud.agent.api.routing.DeleteIpAliasCommand;
import com.cloud.agent.api.routing.DhcpEntryCommand;
import com.cloud.agent.api.routing.DnsMasqConfigCommand;
import com.cloud.agent.api.routing.IpAssocCommand;
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.RemoteAccessVpnCfgCommand;
import com.cloud.agent.api.routing.SavePasswordCommand;
import com.cloud.agent.api.routing.SetFirewallRulesCommand;
import com.cloud.agent.api.routing.SetIpv6FirewallRulesCommand;
import com.cloud.agent.api.routing.SetMonitorServiceCommand;
import com.cloud.agent.api.routing.SetNetworkACLCommand;
import com.cloud.agent.api.routing.SetPortForwardingRulesCommand;
import com.cloud.agent.api.routing.SetPortForwardingRulesVpcCommand;
import com.cloud.agent.api.routing.SetSourceNatCommand;
import com.cloud.agent.api.routing.SetStaticNatRulesCommand;
import com.cloud.agent.api.routing.SetStaticRouteCommand;
import com.cloud.agent.api.routing.Site2SiteVpnCfgCommand;
import com.cloud.agent.api.routing.VmDataCommand;
import com.cloud.agent.api.routing.VpnUsersCfgCommand;
import com.cloud.agent.resource.virtualnetwork.ConfigItem;
import com.cloud.agent.resource.virtualnetwork.FileConfigItem;
import com.cloud.agent.resource.virtualnetwork.ScriptConfigItem;
import com.cloud.agent.resource.virtualnetwork.VRScripts;
import com.cloud.agent.resource.virtualnetwork.model.ConfigBase;
import com.cloud.utils.exception.CloudRuntimeException;
import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
public abstract class AbstractConfigItemFacade {
private static final Logger s_logger = Logger.getLogger(AbstractConfigItemFacade.class);
private final static Gson gson;
private static Hashtable<Class<? extends NetworkElementCommand>, AbstractConfigItemFacade> flyweight = new Hashtable<Class<? extends NetworkElementCommand>, AbstractConfigItemFacade>();
static {
gson = new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.disableHtmlEscaping()
.create();
flyweight.put(SetPortForwardingRulesVpcCommand.class, new SetPortForwardingRulesVpcConfigItem());
flyweight.put(SetPortForwardingRulesCommand.class, new SetPortForwardingRulesConfigItem());
flyweight.put(SetStaticRouteCommand.class, new SetStaticRouteConfigItem());
flyweight.put(SetStaticNatRulesCommand.class, new SetStaticNatRulesConfigItem());
flyweight.put(LoadBalancerConfigCommand.class, new LoadBalancerConfigItem());
flyweight.put(SavePasswordCommand.class, new SavePasswordConfigItem());
flyweight.put(DhcpEntryCommand.class, new DhcpEntryConfigItem());
flyweight.put(CreateIpAliasCommand.class, new CreateIpAliasConfigItem());
flyweight.put(DnsMasqConfigCommand.class, new DnsMasqConfigItem());
flyweight.put(DeleteIpAliasCommand.class, new DeleteIpAliasConfigItem());
flyweight.put(VmDataCommand.class, new VmDataConfigItem());
flyweight.put(SetFirewallRulesCommand.class, new SetFirewallRulesConfigItem());
flyweight.put(SetIpv6FirewallRulesCommand.class, new SetIpv6FirewallRulesConfigItem());
flyweight.put(BumpUpPriorityCommand.class, new BumpUpPriorityConfigItem());
flyweight.put(RemoteAccessVpnCfgCommand.class, new RemoteAccessVpnConfigItem());
flyweight.put(VpnUsersCfgCommand.class, new VpnUsersConfigItem());
flyweight.put(Site2SiteVpnCfgCommand.class, new Site2SiteVpnConfigItem());
flyweight.put(SetMonitorServiceCommand.class, new SetMonitorServiceConfigItem());
flyweight.put(SetupGuestNetworkCommand.class, new SetGuestNetworkConfigItem());
flyweight.put(SetNetworkACLCommand.class, new SetNetworkAclConfigItem());
flyweight.put(SetSourceNatCommand.class, new SetSourceNatConfigItem());
flyweight.put(IpAssocCommand.class, new IpAssociationConfigItem());
flyweight.put(IpAssocVpcCommand.class, new IpAssociationConfigItem());
}
protected String destinationFile;
public static AbstractConfigItemFacade getInstance(final Class<? extends NetworkElementCommand> key) {
if (!flyweight.containsKey(key)) {
throw new CloudRuntimeException("Unable to process the configuration for " + key.getClass().getName());
}
final AbstractConfigItemFacade instance = flyweight.get(key);
return instance;
}
private static String appendUuidToJsonFiles(final String filename) {
String remoteFileName = new String(filename);
if (remoteFileName.endsWith("json")) {
remoteFileName += "." + UUID.randomUUID().toString();
}
return remoteFileName;
}
protected List<ConfigItem> generateConfigItems(final ConfigBase configuration) {
final List<ConfigItem> cfg = new LinkedList<>();
final String remoteFilename = appendUuidToJsonFiles(destinationFile);
if (s_logger.isDebugEnabled()) {
s_logger.debug("Transformed filename: " + destinationFile + " to: " + remoteFilename);
}
final ConfigItem configFile = new FileConfigItem(VRScripts.CONFIG_PERSIST_LOCATION, remoteFilename, gson.toJson(configuration));
cfg.add(configFile);
// By default keep files in processed cache on VR
final String args = configuration.shouldDeleteFromProcessedCache() ? remoteFilename + " false" : remoteFilename;
final ConfigItem updateCommand = new ScriptConfigItem(VRScripts.UPDATE_CONFIG, args);
cfg.add(updateCommand);
return cfg;
}
public abstract List<ConfigItem> generateConfig(NetworkElementCommand cmd);
}