##
# Copyright 2016-2019 VMware Inc.
# This file is part of ETSI OSM
# All Rights Reserved.
#
# 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.
#
# For those usages not covered by the Apache License, Version 2.0 please
# contact:  osslegalrouting@vmware.com
##

The following two tools are provided to help simplify VMware based image
management:

o  ovf_converter - converts libvirt .qcow2 files to VMware .vmdk format.
o  ovf_uploader  - uploads .ovf and .vmdk files to vCD, similar to
                      openstack image upload command.

OVF Converter Usage
===================

This utility can be used for both VMware Integrated Openstack (VIO) or
vCloud Director (vCD).  It converts libvirt images, such as files that end
in .qcow2 or .img to VMware .vmdk format.  Both an .ovf and .vmdk file are
created and can be used as needed.

OVF Uploader Usage
==================

This utility is only used for vCD, as there is no equivalent CLI that provides
the ability to upload images into vCD.  It takes the output OVF from the
converter and uploads both it and the VMDK file to the vCD catalog.

Examples:
=========

o  Upload a CentOS .qcow2 file to VIO

   $ ovf_converter CentOS-7-x86_64-GenericCloud.qcow2
   $ openstack image create --public \
     --file CentOS-7-x86_64-GenericCloud.vmdk \
     --disk-format vmdk CentOS-7

o  Upload a CentOS .qcow2 file to vCD

   $ ovf_converter CentOS-7-x86_64-GenericCloud.qcow2
   $ ovf_uploader -u orgadmin -p password -o osm -l https://vcd \
     CentOS-7-x86_64-GenericCloud.ovf

Both commands suport -h to display help options.

