/usr/lib/python3/dist-packages/pylxd/image.py is in python3-pylxd 2.0.0-0ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | # Copyright (c) 2016 Canonical Ltd
#
#    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.
import hashlib
from pylxd import mixin
from pylxd.operation import Operation
class Image(mixin.Waitable, mixin.Marshallable):
    """A LXD Image."""
    __slots__ = [
        '_client',
        'aliases', 'architecture', 'created_at', 'expires_at', 'filename',
        'fingerprint', 'properties', 'public', 'size', 'uploaded_at'
        ]
    @classmethod
    def get(cls, client, fingerprint):
        """Get an image."""
        response = client.api.images[fingerprint].get()
        if response.status_code == 404:
            raise NameError(
                'No image with fingerprint "{}"'.format(fingerprint))
        image = Image(_client=client, **response.json()['metadata'])
        return image
    @classmethod
    def all(cls, client):
        """Get all images."""
        response = client.api.images.get()
        images = []
        for url in response.json()['metadata']:
            fingerprint = url.split('/')[-1]
            images.append(Image(_client=client, fingerprint=fingerprint))
        return images
    @classmethod
    def create(cls, client, image_data, public=False, wait=False):
        """Create an image."""
        fingerprint = hashlib.sha256(image_data).hexdigest()
        headers = {}
        if public:
            headers['X-LXD-Public'] = '1'
        response = client.api.images.post(
            data=image_data, headers=headers)
        if wait:
            Operation.wait_for_operation(client, response.json()['operation'])
        return cls.get(client, fingerprint)
    def __init__(self, **kwargs):
        super(Image, self).__init__()
        for key, value in kwargs.iteritems():
            setattr(self, key, value)
    def update(self):
        """Update LXD based on changes to this image."""
        self._client.api.images[self.fingerprint].put(
            json=self.marshall())
    def delete(self, wait=False):
        """Delete the image."""
        response = self._client.api.images[self.fingerprint].delete()
        if wait:
            self.wait_for_operation(response.json()['operation'])
 |