<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:

def get_placement(service_instance, datacenter, placement=None):
    '''
    To create a virtual machine a resource pool needs to be supplied, we would like to use the strictest as possible.

    datacenter
        Name of the datacenter

    placement
        Dictionary with the placement info, cluster, host resource pool name

    return
        Resource pool, cluster and host object if any applies
    '''
    log.trace('Retrieving placement information')
    resourcepool_object, placement_object = None, None
    if 'host' in placement:
        host_objects = get_hosts(service_instance, datacenter_name=datacenter, host_names=[placement['host']])
        if not host_objects:
            raise salt.exceptions.VMwareObjectRetrievalError(' '.join([
                'The specified host',
                '{0} cannot be found.'.format(placement['host'])]))
        try:
            host_props = \
                get_properties_of_managed_object(host_objects[0],
                                                 properties=['resourcePool'])
            resourcepool_object = host_props['resourcePool']
        except vmodl.query.InvalidProperty:
            traversal_spec = vmodl.query.PropertyCollector.TraversalSpec(
                path='parent',
                skip=True,
                type=vim.HostSystem,
                selectSet=[vmodl.query.PropertyCollector.TraversalSpec(
                    path='resourcePool',
                    skip=False,
                    type=vim.ClusterComputeResource)])
            resourcepools = get_mors_with_properties(service_instance,
                                                     vim.ResourcePool,
                                                     container_ref=host_objects[0],
                                                     property_list=['name'],
                                                     traversal_spec=traversal_spec)
            if resourcepools:
                resourcepool_object = resourcepools[0]['object']
            else:
                raise salt.exceptions.VMwareObjectRetrievalError(
                    'The resource pool of host {0} cannot be found.'.format(placement['host']))
        placement_object = host_objects[0]
    elif 'resourcepool' in placement:
        resourcepool_objects = get_resource_pools(service_instance,
                                                  [placement['resourcepool']],
                                                  datacenter_name=datacenter)
        if len(resourcepool_objects) > 1:
            raise salt.exceptions.VMwareMultipleObjectsError(' '.join([
                'Multiple instances are available of the',
                'specified host {}.'.format(placement['host'])]))
        resourcepool_object = resourcepool_objects[0]
        res_props = get_properties_of_managed_object(resourcepool_object,
                                                     properties=['parent'])
        if 'parent' in res_props:
            placement_object = res_props['parent']
        else:
            raise salt.exceptions.VMwareObjectRetrievalError(' '.join([
                'The resource pool\'s parent',
                'object is not defined']))
    elif 'cluster' in placement:
        datacenter_object = get_datacenter(service_instance, datacenter)
        cluster_object = get_cluster(datacenter_object, placement['cluster'])
        clus_props = get_properties_of_managed_object(cluster_object,
                                                      properties=['resourcePool'])
        if 'resourcePool' in clus_props:
            resourcepool_object = clus_props['resourcePool']
        else:
            raise salt.exceptions.VMwareObjectRetrievalError(' '.join([
                'The cluster\'s resource pool',
                'object is not defined']))
        placement_object = cluster_object
    else:
        # We are checking the schema for this object, this exception should never be raised
        raise salt.exceptions.VMwareObjectRetrievalError(' '.join([
            'Placement is not defined.']))
    return (resourcepool_object, placement_object)