// 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.network;

public class NetworkManagerTestComponentLibrary {

    /* (non-Javadoc)
     * @see com.cloud.configuration.DefaultComponentLibrary#populateManagers()
     */
    protected void populateManagers() {
//        addManager("configuration manager", MockConfigurationManagerImpl.class);
//        addManager("account manager", MockAccountManagerImpl.class);
//        addManager("domain manager", MockDomainManagerImpl.class);
//        addManager("resource limit manager", MockResourceLimitManagerImpl.class);
//        addManager("network service", NetworkServiceImpl.class);
//        addManager("network manager", NetworkManagerImpl.class);
//        addManager("network model", NetworkModelImpl.class);
//        addManager("LoadBalancingRulesManager", LoadBalancingRulesManagerImpl.class);
//        //addManager("AutoScaleManager", AutoScaleManagerImpl.class);
//        addManager("RulesManager", RulesManagerImpl.class);
//        addManager("RemoteAccessVpnManager", RemoteAccessVpnManagerImpl.class);
//        addManager("FirewallManager", FirewallManagerImpl.class);
//        addManager("StorageNetworkManager", StorageNetworkManagerImpl.class);
//        addManager("VPC Manager", MockVpcManagerImpl.class);
//        addManager("VpcVirtualRouterManager", MockVpcVirtualNetworkApplianceManager.class);
//        addManager("NetworkACLManager", NetworkACLManagerImpl.class);
//        addManager("Site2SiteVpnManager", Site2SiteVpnManagerImpl.class);
//        addManager("Alert Manager", MockAlertManagerImpl.class);
//        addManager("ProjectManager", MockProjectManagerImpl.class);
//        //addManager("SwiftManager", SwiftManagerImpl.class);
//        //addManager("S3Manager", S3ManagerImpl.class);
//        //addManager("SecondaryStorageManager", SecondaryStorageManagerImpl.class);
//        //addManager("SecurityGroupManager", SecurityGroupManagerImpl2.class);
//        addManager("AgentManager", MockAgentManagerImpl.class);
//        addManager("ExternalLoadBalancerUsageManager", ExternalLoadBalancerUsageManagerImpl.class);
//        //addManager("TemplateManager", TemplateManagerImpl.class);
//        //addManager("VirtualMachineManager", MockVirtualMachineManagerImpl.class);
//        addManager("ResourceManager", MockResourceManagerImpl.class);
//        addManager("ExternalDhcpManager", ExternalDhcpManagerImpl.class);

    }

}
