'Copy an image to your image collection.
:param  name: The name of the image
:type   name: ``str``
:param  url: The URL to the image. The URL can start with `gs://`
:type url: ``str``
:param  description: The description of the image
:type   description: ``str``
:param  family: The family of the image
:type   family: ``str``
:param  guest_os_features: The features of the guest operating system.
:type   guest_os_features: ``list`` of ``str`` or ``None``
:return:  NodeImage object based on provided information or None if an
image with that name is not found.
:rtype:   :class:`NodeImage` or ``None``'

def ex_copy_image(self, name, url, description=None, family=None, guest_os_features=None):

    if url.startswith('gs://'):
        url = url.replace('gs://', 'https://storage.googleapis.com/', 1)
    image_data = {'name': name, 'description': description, 'family': family, 'sourceType': 'RAW', 'rawDisk': {'source': url}}
    if guest_os_features:
        image_data['guestOsFeatures'] = []
        if isinstance(guest_os_features, str):
            guest_os_features = [guest_os_features]
        for feature in guest_os_features:
            image_data['guestOsFeatures'].append({'type': feature})
    request = '/global/images'
    self.connection.async_request(request, method='POST', data=image_data)
    return self.ex_get_image(name)
