content: // 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.vm;
  
  import java.util.ArrayList;
  import java.util.HashMap;
  import java.util.List;
  import java.util.Map;
  
  import com.cloud.agent.api.to.DiskTO;
  import com.cloud.host.Host;
  import com.cloud.hypervisor.Hypervisor.HypervisorType;
  import com.cloud.network.element.NetworkElement;
  import com.cloud.offering.ServiceOffering;
  import com.cloud.template.VirtualMachineTemplate;
  import com.cloud.template.VirtualMachineTemplate.BootloaderType;
  import com.cloud.user.Account;
  import com.cloud.utils.db.EntityManager;
  
  /**
   * Implementation of VirtualMachineProfile.
   *
   */
  public class VirtualMachineProfileImpl implements VirtualMachineProfile {
  
      VirtualMachine _vm;
      ServiceOffering _offering;
      VirtualMachineTemplate _template;
      VMInstanceDetailVO _userVmDetails;
      Map<Param, Object> _params;
      List<NicProfile> _nics = new ArrayList<NicProfile>();
      List<DiskTO> _disks = new ArrayList<DiskTO>();
      StringBuilder _bootArgs = new StringBuilder();
      Account _owner;
      BootloaderType _bootloader;
      Float cpuOvercommitRatio = 1.0f;
      Float memoryOvercommitRatio = 1.0f;
  
      Host _host = null;
  
      VirtualMachine.Type _type;
  
      List<String[]> vmData = null;
  
      String configDriveLabel = null;
      String configDriveIsoBaseLocation = "/tmp/";
      String configDriveIsoRootFolder = null;
      String configDriveIsoFile = null;
      NetworkElement.Location configDriveLocation = NetworkElement.Location.SECONDARY;
  
      public VirtualMachineProfileImpl(VirtualMachine vm, VirtualMachineTemplate template, ServiceOffering offering, Account owner, Map<Param, Object> params) {
          _vm = vm;
          _template = template;
          _offering = offering;
          _params = params;
          _owner = owner;
          if (_params == null) {
              _params = new HashMap<Param, Object>();
          }
          if (vm != null)
              _type = vm.getType();
      }
  
      public VirtualMachineProfileImpl(VirtualMachine vm) {
          this(vm, null, null, null, null);
      }
  
      public VirtualMachineProfileImpl(VirtualMachine.Type type) {
          _type = type;
      }
  
      @Override
      public String toString() {
          if (_vm != null) {
              return _vm.toString();
          }
          return "";
      }
  
      @Override
      public VirtualMachine getVirtualMachine() {
          return _vm;
      }
  
      @Override
      public ServiceOffering getServiceOffering() {
          if (_offering == null) {
              _offering = s_entityMgr.findById(ServiceOffering.class, _vm.getServiceOfferingId());
          }
          return _offering;
      }
  
      @Override
      public void setParameter(Param name, Object value) {
          _params.put(name, value);
      }
  
      @Override
      public void setBootLoaderType(BootloaderType bootLoader) {
          _bootloader = bootLoader;
      }
  
      @Override
      public VirtualMachineTemplate getTemplate() {
          if (_template == null && _vm != null) {
              _template = s_entityMgr.findByIdIncludingRemoved(VirtualMachineTemplate.class, _vm.getTemplateId());
          }
          return _template;
      }
  
      @Override
      public HypervisorType getHypervisorType() {
          return _vm.getHypervisorType();
      }
  
      @Override
      public long getTemplateId() {
          return _vm.getTemplateId();
      }
  
      @Override
      public long getServiceOfferingId() {
          return _vm.getServiceOfferingId();
      }
  
      @Override
      public long getId() {
          return _vm.getId();
      }
  
      @Override
      public String getUuid() {
          return _vm.getUuid();
      }
  
      public void setNics(List<NicProfile> nics) {
          _nics = nics;
      }
  
      public void setDisks(List<DiskTO> disks) {
          _disks = disks;
      }
  
      @Override
      public List<NicProfile> getNics() {
          return _nics;
      }
  
      @Override
      public List<DiskTO> getDisks() {
          return _disks;
      }
  
      @Override
      public void addNic(int index, NicProfile nic) {
          _nics.add(index, nic);
      }
  
      @Override
      public void addDisk(int index, DiskTO disk) {
          _disks.add(index, disk);
      }
  
      @Override
      public StringBuilder getBootArgsBuilder() {
          return _bootArgs;
      }
  
      @Override
      public void addBootArgs(String... args) {
          for (String arg : args) {
              _bootArgs.append(arg).append(" ");
          }
      }
  
      @Override
      public VirtualMachine.Type getType() {
          return _type;
      }
  
      @Override
      public Account getOwner() {
          if (_owner == null) {
              _owner = s_entityMgr.findById(Account.class, _vm.getAccountId());
          }
          return _owner;
      }
  
      @Override
      public String getBootArgs() {
          return _bootArgs.toString();
      }
  
      static EntityManager s_entityMgr;
  
      static void init(EntityManager entityMgr) {
          s_entityMgr = entityMgr;
      }
  
      @Override
      public void addNic(NicProfile nic) {
          _nics.add(nic);
      }
  
      @Override
      public void addDisk(DiskTO disk) {
          _disks.add(disk);
      }
  
      @Override
      public Object getParameter(Param name) {
          return _params.get(name);
      }
  
      @Override
      public Long getHostId() {
          if (_host != null) {
              return _host.getId();
          }
          return _vm.getHostId();
      }
  
      @Override
      public void setHost(Host host) {
          this._host = host;
      }
  
      @Override
      public String getHostName() {
          return _vm.getHostName();
      }
  
      @Override
      public String getInstanceName() {
          return _vm.getInstanceName();
      }
  
      @Override
      public BootloaderType getBootLoaderType() {
          return _bootloader;
      }
  
      @Override
      public Map<Param, Object> getParameters() {
          return _params;
      }
  
      @Override
      public void setServiceOffering(ServiceOffering offering) {
          _offering = offering;
      }
  
      @Override
      public void setCpuOvercommitRatio(Float cpuOvercommitRatio) {
          this.cpuOvercommitRatio = cpuOvercommitRatio;
  
      }
  
      @Override
      public void setMemoryOvercommitRatio(Float memoryOvercommitRatio) {
          this.memoryOvercommitRatio = memoryOvercommitRatio;
  
      }
  
      @Override
      public Float getCpuOvercommitRatio() {
          return cpuOvercommitRatio;
      }
  
      @Override
      public Float getMemoryOvercommitRatio() {
          return memoryOvercommitRatio;
      }
  
      @Override
      public boolean isRollingRestart() {
          return Boolean.TRUE.equals(getParameter(VirtualMachineProfile.Param.RollingRestart));
      }
  
      @Override
      public List<String[]> getVmData() {
          return vmData;
      }
  
      @Override
      public void setVmData(List<String[]> vmData) {
          this.vmData = vmData;
      }
  
      @Override
      public String getConfigDriveLabel() {
          return configDriveLabel;
      }
  
      @Override
      public void setConfigDriveLabel(String configDriveLabel) {
          this.configDriveLabel = configDriveLabel;
      }
  
      @Override
      public String getConfigDriveIsoRootFolder() {
          return configDriveIsoRootFolder;
      }
  
      @Override
      public void setConfigDriveIsoRootFolder(String configDriveIsoRootFolder) {
          this.configDriveIsoRootFolder = configDriveIsoRootFolder;
      }
  
      public String getConfigDriveIsoBaseLocation() {
          return configDriveIsoBaseLocation;
      }
  
      @Override
      public String getConfigDriveIsoFile() {
          return configDriveIsoFile;
      }
  
      @Override
      public void setConfigDriveIsoFile(String isoFile) {
          this.configDriveIsoFile = isoFile;
      }
  
      @Override
      public NetworkElement.Location getConfigDriveLocation() {
          return configDriveLocation;
      }
  
      @Override
      public void setConfigDriveLocation(NetworkElement.Location location) {
          this.configDriveLocation = location;
      }
  }
  