#!/usr/bin/ruby

# -------------------------------------------------------------------------- #
# Copyright 2002-2019, OpenNebula Project, OpenNebula Systems                #
#                                                                            #
# Licensed 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.                                             #
#--------------------------------------------------------------------------- #

$LOAD_PATH.unshift File.dirname(__FILE__)

require 'container'

require_relative '../../scripts_common'

# ------------------------------------------------------------------------------
# Action Arguments, STDIN includes XML description of the OpenNebula VM
# ------------------------------------------------------------------------------
xml_path = ARGV[0]
vm_id    = ARGV[2]

xml = STDIN.read

# ------------------------------------------------------------------------------
# Action Arguments, STDIN includes XML description of the OpenNebula VM
# ------------------------------------------------------------------------------
client    = LXDClient.new
container = Container.new_from_xml(xml, client)

# ------------------------------------------------------------------------------
# Create Container in LXD
#   - Already exists: Raise error if container is detected running
#   - Doesn't exist. Creates new container in LXD.
# ------------------------------------------------------------------------------
if Container.exist?(container.name, client)
    running = container.check_status == 'Running'
    raise 'A container with the same ID is already running' if running

    OpenNebula.log_info('Overriding container')

    container.update
else
    container.create
end

# ------------------------------------------------------------------------------
# Start the container, if not wild, maps storage to host directories
# ------------------------------------------------------------------------------
if container.wild?
    container.start
else
    if !container.setup_storage('map')
        container.clean

        raise 'failed to setup container storage'
    end

    container.load_idmap

    begin
        operation = container.start
        raise operation if container.status != 'Running'
    rescue StandardError => exception
        # TODO: Improve wait condition
        sleep 5 # Wait for LXD to revert non-rootfs disks mountpoint

        container.clean

        raise exception
    end

end

#-------------------------------------------------------------------------------
# Updates container configuration with the OpenNebulaVM description
# ------------------------------------------------------------------------------
container.config.update('user.xml' => xml)
container.update

container.vnc('start')

puts container.name
