Remove boto
package dependency
The `boto` library (long ago superseded by `boto3`) has not had an official release in over two years or even a commit in the last 18 months. Importing the package (or indirectly importing it by via `moto`) generates a deprecation warning. Additionally, an ever-increasing number of `moto` users who have left `boto` behind for `boto3` are still being forced to install `boto`. This commit vendors a very small subset of the `boto` library--only the code required by `moto` to run--into the /packages subdirectory. A README file is included explaining the origin of the files and a recommendation for how they can be removed entirely in a future release. NOTE: Users of `boto` will still be able to use `moto` after this is merged. closes #2978 closes #3013 closes #3170 closes #3418 relates to #2950
This commit is contained in:
parent
bd4aa65635
commit
ae85c539fd
@ -2,7 +2,10 @@ from __future__ import unicode_literals
|
||||
|
||||
import random
|
||||
|
||||
from boto.ec2.blockdevicemapping import BlockDeviceType, BlockDeviceMapping
|
||||
from moto.packages.boto.ec2.blockdevicemapping import (
|
||||
BlockDeviceType,
|
||||
BlockDeviceMapping,
|
||||
)
|
||||
from moto.ec2.exceptions import InvalidInstanceIdError
|
||||
|
||||
from moto.compat import OrderedDict
|
||||
|
@ -50,7 +50,7 @@ from .exceptions import (
|
||||
UnformattedGetAttTemplateException,
|
||||
ValidationError,
|
||||
)
|
||||
from boto.cloudformation.stack import Output
|
||||
from moto.packages.boto.cloudformation.stack import Output
|
||||
|
||||
# List of supported CloudFormation models
|
||||
MODEL_LIST = CloudFormationModel.__subclasses__()
|
||||
|
@ -15,10 +15,15 @@ from pkg_resources import resource_filename
|
||||
from collections import defaultdict
|
||||
import weakref
|
||||
from datetime import datetime
|
||||
from boto.ec2.instance import Instance as BotoInstance, Reservation
|
||||
from boto.ec2.blockdevicemapping import BlockDeviceMapping, BlockDeviceType
|
||||
from boto.ec2.spotinstancerequest import SpotInstanceRequest as BotoSpotRequest
|
||||
from boto.ec2.launchspecification import LaunchSpecification
|
||||
from moto.packages.boto.ec2.instance import Instance as BotoInstance, Reservation
|
||||
from moto.packages.boto.ec2.blockdevicemapping import (
|
||||
BlockDeviceMapping,
|
||||
BlockDeviceType,
|
||||
)
|
||||
from moto.packages.boto.ec2.spotinstancerequest import (
|
||||
SpotInstanceRequest as BotoSpotRequest,
|
||||
)
|
||||
from moto.packages.boto.ec2.launchspecification import LaunchSpecification
|
||||
|
||||
from moto.compat import OrderedDict
|
||||
from moto.core import BaseBackend
|
||||
|
@ -1,5 +1,5 @@
|
||||
from __future__ import unicode_literals
|
||||
from boto.ec2.instancetype import InstanceType
|
||||
from moto.packages.boto.ec2.instancetype import InstanceType
|
||||
|
||||
from moto.autoscaling import autoscaling_backends
|
||||
from moto.core.responses import BaseResponse
|
||||
|
@ -1,4 +1,4 @@
|
||||
import boto.ec2
|
||||
from boto3 import Session
|
||||
import json
|
||||
from moto.core import BaseBackend
|
||||
|
||||
@ -11,5 +11,9 @@ class Ec2InstanceConnectBackend(BaseBackend):
|
||||
|
||||
|
||||
ec2instanceconnect_backends = {}
|
||||
for region in boto.ec2.regions():
|
||||
ec2instanceconnect_backends[region.name] = Ec2InstanceConnectBackend()
|
||||
for region in Session().get_available_regions("ec2"):
|
||||
ec2instanceconnect_backends[region] = Ec2InstanceConnectBackend()
|
||||
for region in Session().get_available_regions("ec2", partition_name="aws-us-gov"):
|
||||
ec2instanceconnect_backends[region] = Ec2InstanceConnectBackend()
|
||||
for region in Session().get_available_regions("ec2", partition_name="aws-cn"):
|
||||
ec2instanceconnect_backends[region] = Ec2InstanceConnectBackend()
|
||||
|
@ -4,14 +4,14 @@ import datetime
|
||||
|
||||
import pytz
|
||||
|
||||
from boto.ec2.elb.attributes import (
|
||||
from moto.packages.boto.ec2.elb.attributes import (
|
||||
LbAttributes,
|
||||
ConnectionSettingAttribute,
|
||||
ConnectionDrainingAttribute,
|
||||
AccessLogAttribute,
|
||||
CrossZoneLoadBalancingAttribute,
|
||||
)
|
||||
from boto.ec2.elb.policies import Policies, OtherPolicy
|
||||
from moto.packages.boto.ec2.elb.policies import Policies, OtherPolicy
|
||||
from moto.compat import OrderedDict
|
||||
from moto.core import BaseBackend, BaseModel, CloudFormationModel
|
||||
from moto.ec2.models import ec2_backends
|
||||
|
@ -1,11 +1,11 @@
|
||||
from __future__ import unicode_literals
|
||||
from boto.ec2.elb.attributes import (
|
||||
from moto.packages.boto.ec2.elb.attributes import (
|
||||
ConnectionSettingAttribute,
|
||||
ConnectionDrainingAttribute,
|
||||
AccessLogAttribute,
|
||||
CrossZoneLoadBalancingAttribute,
|
||||
)
|
||||
from boto.ec2.elb.policies import AppCookieStickinessPolicy, OtherPolicy
|
||||
from moto.packages.boto.ec2.elb.policies import AppCookieStickinessPolicy, OtherPolicy
|
||||
|
||||
from moto.core.responses import BaseResponse
|
||||
from .models import elb_backends
|
||||
|
18
moto/packages/boto/README.md
Normal file
18
moto/packages/boto/README.md
Normal file
@ -0,0 +1,18 @@
|
||||
## Removing the `boto` Dependency
|
||||
|
||||
In order to rid `moto` of a direct dependency on the long-deprecated `boto`
|
||||
package, a subset of the `boto` code has been vendored here.
|
||||
|
||||
This directory contains only the `boto` files required for `moto` to run,
|
||||
which is a very small subset of the original package's contents. Furthermore,
|
||||
the `boto` models collected here have been stripped of all superfluous
|
||||
methods/attributes not used by `moto`. (Any copyright headers on the
|
||||
original files have been left intact.)
|
||||
|
||||
## Next Steps
|
||||
|
||||
Currently, a small number of `moto` models inherit from these `boto` classes.
|
||||
With some additional work, the inheritance can be dropped in favor of simply
|
||||
adding the required methods/properties from these `boto` models to their
|
||||
respective `moto` subclasses, which would allow for these files/directories
|
||||
to be removed entirely.
|
0
moto/packages/boto/__init__.py
Normal file
0
moto/packages/boto/__init__.py
Normal file
0
moto/packages/boto/cloudformation/__init__.py
Normal file
0
moto/packages/boto/cloudformation/__init__.py
Normal file
9
moto/packages/boto/cloudformation/stack.py
Normal file
9
moto/packages/boto/cloudformation/stack.py
Normal file
@ -0,0 +1,9 @@
|
||||
class Output(object):
|
||||
def __init__(self, connection=None):
|
||||
self.connection = connection
|
||||
self.description = None
|
||||
self.key = None
|
||||
self.value = None
|
||||
|
||||
def __repr__(self):
|
||||
return 'Output:"%s"="%s"' % (self.key, self.value)
|
0
moto/packages/boto/ec2/__init__.py
Normal file
0
moto/packages/boto/ec2/__init__.py
Normal file
83
moto/packages/boto/ec2/blockdevicemapping.py
Normal file
83
moto/packages/boto/ec2/blockdevicemapping.py
Normal file
@ -0,0 +1,83 @@
|
||||
# Copyright (c) 2009-2012 Mitch Garnaat http://garnaat.org/
|
||||
# Copyright (c) 2012 Amazon.com, Inc. or its affiliates. All Rights Reserved
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
|
||||
class BlockDeviceType(object):
|
||||
"""
|
||||
Represents parameters for a block device.
|
||||
"""
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
connection=None,
|
||||
ephemeral_name=None,
|
||||
no_device=False,
|
||||
volume_id=None,
|
||||
snapshot_id=None,
|
||||
status=None,
|
||||
attach_time=None,
|
||||
delete_on_termination=False,
|
||||
size=None,
|
||||
volume_type=None,
|
||||
iops=None,
|
||||
encrypted=None,
|
||||
):
|
||||
self.connection = connection
|
||||
self.ephemeral_name = ephemeral_name
|
||||
self.no_device = no_device
|
||||
self.volume_id = volume_id
|
||||
self.snapshot_id = snapshot_id
|
||||
self.status = status
|
||||
self.attach_time = attach_time
|
||||
self.delete_on_termination = delete_on_termination
|
||||
self.size = size
|
||||
self.volume_type = volume_type
|
||||
self.iops = iops
|
||||
self.encrypted = encrypted
|
||||
|
||||
|
||||
# for backwards compatibility
|
||||
EBSBlockDeviceType = BlockDeviceType
|
||||
|
||||
|
||||
class BlockDeviceMapping(dict):
|
||||
"""
|
||||
Represents a collection of BlockDeviceTypes when creating ec2 instances.
|
||||
|
||||
Example:
|
||||
dev_sda1 = BlockDeviceType()
|
||||
dev_sda1.size = 100 # change root volume to 100GB instead of default
|
||||
bdm = BlockDeviceMapping()
|
||||
bdm['/dev/sda1'] = dev_sda1
|
||||
reservation = image.run(..., block_device_map=bdm, ...)
|
||||
"""
|
||||
|
||||
def __init__(self, connection=None):
|
||||
"""
|
||||
:type connection: :class:`boto.ec2.EC2Connection`
|
||||
:param connection: Optional connection.
|
||||
"""
|
||||
dict.__init__(self)
|
||||
self.connection = connection
|
||||
self.current_name = None
|
||||
self.current_value = None
|
48
moto/packages/boto/ec2/ec2object.py
Normal file
48
moto/packages/boto/ec2/ec2object.py
Normal file
@ -0,0 +1,48 @@
|
||||
# Copyright (c) 2006-2010 Mitch Garnaat http://garnaat.org/
|
||||
# Copyright (c) 2010, Eucalyptus Systems, Inc.
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
"""
|
||||
Represents an EC2 Object
|
||||
"""
|
||||
from moto.packages.boto.ec2.tag import TagSet
|
||||
|
||||
|
||||
class EC2Object(object):
|
||||
def __init__(self, connection=None):
|
||||
self.connection = connection
|
||||
self.region = None
|
||||
|
||||
|
||||
class TaggedEC2Object(EC2Object):
|
||||
"""
|
||||
Any EC2 resource that can be tagged should be represented
|
||||
by a Python object that subclasses this class. This class
|
||||
has the mechanism in place to handle the tagSet element in
|
||||
the Describe* responses. If tags are found, it will create
|
||||
a TagSet object and allow it to parse and collect the tags
|
||||
into a dict that is stored in the "tags" attribute of the
|
||||
object.
|
||||
"""
|
||||
|
||||
def __init__(self, connection=None):
|
||||
super(TaggedEC2Object, self).__init__(connection)
|
||||
self.tags = TagSet()
|
0
moto/packages/boto/ec2/elb/__init__.py
Normal file
0
moto/packages/boto/ec2/elb/__init__.py
Normal file
100
moto/packages/boto/ec2/elb/attributes.py
Normal file
100
moto/packages/boto/ec2/elb/attributes.py
Normal file
@ -0,0 +1,100 @@
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
#
|
||||
# Created by Chris Huegle for TellApart, Inc.
|
||||
|
||||
|
||||
class ConnectionSettingAttribute(object):
|
||||
"""
|
||||
Represents the ConnectionSetting segment of ELB Attributes.
|
||||
"""
|
||||
|
||||
def __init__(self, connection=None):
|
||||
self.idle_timeout = None
|
||||
|
||||
def __repr__(self):
|
||||
return "ConnectionSettingAttribute(%s)" % (self.idle_timeout)
|
||||
|
||||
|
||||
class CrossZoneLoadBalancingAttribute(object):
|
||||
"""
|
||||
Represents the CrossZoneLoadBalancing segement of ELB Attributes.
|
||||
"""
|
||||
|
||||
def __init__(self, connection=None):
|
||||
self.enabled = None
|
||||
|
||||
def __repr__(self):
|
||||
return "CrossZoneLoadBalancingAttribute(%s)" % (self.enabled)
|
||||
|
||||
|
||||
class AccessLogAttribute(object):
|
||||
"""
|
||||
Represents the AccessLog segment of ELB attributes.
|
||||
"""
|
||||
|
||||
def __init__(self, connection=None):
|
||||
self.enabled = None
|
||||
self.s3_bucket_name = None
|
||||
self.s3_bucket_prefix = None
|
||||
self.emit_interval = None
|
||||
|
||||
def __repr__(self):
|
||||
return "AccessLog(%s, %s, %s, %s)" % (
|
||||
self.enabled,
|
||||
self.s3_bucket_name,
|
||||
self.s3_bucket_prefix,
|
||||
self.emit_interval,
|
||||
)
|
||||
|
||||
|
||||
class ConnectionDrainingAttribute(object):
|
||||
"""
|
||||
Represents the ConnectionDraining segment of ELB attributes.
|
||||
"""
|
||||
|
||||
def __init__(self, connection=None):
|
||||
self.enabled = None
|
||||
self.timeout = None
|
||||
|
||||
def __repr__(self):
|
||||
return "ConnectionDraining(%s, %s)" % (self.enabled, self.timeout)
|
||||
|
||||
|
||||
class LbAttributes(object):
|
||||
"""
|
||||
Represents the Attributes of an Elastic Load Balancer.
|
||||
"""
|
||||
|
||||
def __init__(self, connection=None):
|
||||
self.connection = connection
|
||||
self.cross_zone_load_balancing = CrossZoneLoadBalancingAttribute(
|
||||
self.connection
|
||||
)
|
||||
self.access_log = AccessLogAttribute(self.connection)
|
||||
self.connection_draining = ConnectionDrainingAttribute(self.connection)
|
||||
self.connecting_settings = ConnectionSettingAttribute(self.connection)
|
||||
|
||||
def __repr__(self):
|
||||
return "LbAttributes(%s, %s, %s, %s)" % (
|
||||
repr(self.cross_zone_load_balancing),
|
||||
repr(self.access_log),
|
||||
repr(self.connection_draining),
|
||||
repr(self.connecting_settings),
|
||||
)
|
55
moto/packages/boto/ec2/elb/policies.py
Normal file
55
moto/packages/boto/ec2/elb/policies.py
Normal file
@ -0,0 +1,55 @@
|
||||
# Copyright (c) 2010 Reza Lotun http://reza.lotun.name
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
|
||||
class AppCookieStickinessPolicy(object):
|
||||
def __init__(self, connection=None):
|
||||
self.cookie_name = None
|
||||
self.policy_name = None
|
||||
|
||||
def __repr__(self):
|
||||
return "AppCookieStickiness(%s, %s)" % (self.policy_name, self.cookie_name)
|
||||
|
||||
|
||||
class OtherPolicy(object):
|
||||
def __init__(self, connection=None):
|
||||
self.policy_name = None
|
||||
|
||||
def __repr__(self):
|
||||
return "OtherPolicy(%s)" % (self.policy_name)
|
||||
|
||||
|
||||
class Policies(object):
|
||||
"""
|
||||
ELB Policies
|
||||
"""
|
||||
|
||||
def __init__(self, connection=None):
|
||||
self.connection = connection
|
||||
self.app_cookie_stickiness_policies = None
|
||||
self.lb_cookie_stickiness_policies = None
|
||||
self.other_policies = None
|
||||
|
||||
def __repr__(self):
|
||||
app = "AppCookieStickiness%s" % self.app_cookie_stickiness_policies
|
||||
lb = "LBCookieStickiness%s" % self.lb_cookie_stickiness_policies
|
||||
other = "Other%s" % self.other_policies
|
||||
return "Policies(%s,%s,%s)" % (app, lb, other)
|
25
moto/packages/boto/ec2/image.py
Normal file
25
moto/packages/boto/ec2/image.py
Normal file
@ -0,0 +1,25 @@
|
||||
# Copyright (c) 2006-2010 Mitch Garnaat http://garnaat.org/
|
||||
# Copyright (c) 2010, Eucalyptus Systems, Inc.
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
|
||||
class ProductCodes(list):
|
||||
pass
|
217
moto/packages/boto/ec2/instance.py
Normal file
217
moto/packages/boto/ec2/instance.py
Normal file
@ -0,0 +1,217 @@
|
||||
# Copyright (c) 2006-2012 Mitch Garnaat http://garnaat.org/
|
||||
# Copyright (c) 2010, Eucalyptus Systems, Inc.
|
||||
# Copyright (c) 2012 Amazon.com, Inc. or its affiliates. All Rights Reserved
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
"""
|
||||
Represents an EC2 Instance
|
||||
"""
|
||||
from moto.packages.boto.ec2.ec2object import EC2Object, TaggedEC2Object
|
||||
from moto.packages.boto.ec2.image import ProductCodes
|
||||
|
||||
|
||||
class InstanceState(object):
|
||||
"""
|
||||
The state of the instance.
|
||||
|
||||
:ivar code: The low byte represents the state. The high byte is an
|
||||
opaque internal value and should be ignored. Valid values:
|
||||
|
||||
* 0 (pending)
|
||||
* 16 (running)
|
||||
* 32 (shutting-down)
|
||||
* 48 (terminated)
|
||||
* 64 (stopping)
|
||||
* 80 (stopped)
|
||||
|
||||
:ivar name: The name of the state of the instance. Valid values:
|
||||
|
||||
* "pending"
|
||||
* "running"
|
||||
* "shutting-down"
|
||||
* "terminated"
|
||||
* "stopping"
|
||||
* "stopped"
|
||||
"""
|
||||
|
||||
def __init__(self, code=0, name=None):
|
||||
self.code = code
|
||||
self.name = name
|
||||
|
||||
def __repr__(self):
|
||||
return "%s(%d)" % (self.name, self.code)
|
||||
|
||||
|
||||
class InstancePlacement(object):
|
||||
"""
|
||||
The location where the instance launched.
|
||||
|
||||
:ivar zone: The Availability Zone of the instance.
|
||||
:ivar group_name: The name of the placement group the instance is
|
||||
in (for cluster compute instances).
|
||||
:ivar tenancy: The tenancy of the instance (if the instance is
|
||||
running within a VPC). An instance with a tenancy of dedicated
|
||||
runs on single-tenant hardware.
|
||||
"""
|
||||
|
||||
def __init__(self, zone=None, group_name=None, tenancy=None):
|
||||
self.zone = zone
|
||||
self.group_name = group_name
|
||||
self.tenancy = tenancy
|
||||
|
||||
def __repr__(self):
|
||||
return self.zone
|
||||
|
||||
|
||||
class Reservation(EC2Object):
|
||||
"""
|
||||
Represents a Reservation response object.
|
||||
|
||||
:ivar id: The unique ID of the Reservation.
|
||||
:ivar owner_id: The unique ID of the owner of the Reservation.
|
||||
:ivar groups: A list of Group objects representing the security
|
||||
groups associated with launched instances.
|
||||
:ivar instances: A list of Instance objects launched in this
|
||||
Reservation.
|
||||
"""
|
||||
|
||||
def __init__(self, connection=None):
|
||||
super(Reservation, self).__init__(connection)
|
||||
self.id = None
|
||||
self.owner_id = None
|
||||
self.groups = []
|
||||
self.instances = []
|
||||
|
||||
def __repr__(self):
|
||||
return "Reservation:%s" % self.id
|
||||
|
||||
|
||||
class Instance(TaggedEC2Object):
|
||||
"""
|
||||
Represents an instance.
|
||||
|
||||
:ivar id: The unique ID of the Instance.
|
||||
:ivar groups: A list of Group objects representing the security
|
||||
groups associated with the instance.
|
||||
:ivar public_dns_name: The public dns name of the instance.
|
||||
:ivar private_dns_name: The private dns name of the instance.
|
||||
:ivar state: The string representation of the instance's current state.
|
||||
:ivar state_code: An integer representation of the instance's
|
||||
current state.
|
||||
:ivar previous_state: The string representation of the instance's
|
||||
previous state.
|
||||
:ivar previous_state_code: An integer representation of the
|
||||
instance's current state.
|
||||
:ivar key_name: The name of the SSH key associated with the instance.
|
||||
:ivar instance_type: The type of instance (e.g. m1.small).
|
||||
:ivar launch_time: The time the instance was launched.
|
||||
:ivar image_id: The ID of the AMI used to launch this instance.
|
||||
:ivar placement: The availability zone in which the instance is running.
|
||||
:ivar placement_group: The name of the placement group the instance
|
||||
is in (for cluster compute instances).
|
||||
:ivar placement_tenancy: The tenancy of the instance, if the instance
|
||||
is running within a VPC. An instance with a tenancy of dedicated
|
||||
runs on a single-tenant hardware.
|
||||
:ivar kernel: The kernel associated with the instance.
|
||||
:ivar ramdisk: The ramdisk associated with the instance.
|
||||
:ivar architecture: The architecture of the image (i386|x86_64).
|
||||
:ivar hypervisor: The hypervisor used.
|
||||
:ivar virtualization_type: The type of virtualization used.
|
||||
:ivar product_codes: A list of product codes associated with this instance.
|
||||
:ivar ami_launch_index: This instances position within it's launch group.
|
||||
:ivar monitored: A boolean indicating whether monitoring is enabled or not.
|
||||
:ivar monitoring_state: A string value that contains the actual value
|
||||
of the monitoring element returned by EC2.
|
||||
:ivar spot_instance_request_id: The ID of the spot instance request
|
||||
if this is a spot instance.
|
||||
:ivar subnet_id: The VPC Subnet ID, if running in VPC.
|
||||
:ivar vpc_id: The VPC ID, if running in VPC.
|
||||
:ivar private_ip_address: The private IP address of the instance.
|
||||
:ivar ip_address: The public IP address of the instance.
|
||||
:ivar platform: Platform of the instance (e.g. Windows)
|
||||
:ivar root_device_name: The name of the root device.
|
||||
:ivar root_device_type: The root device type (ebs|instance-store).
|
||||
:ivar block_device_mapping: The Block Device Mapping for the instance.
|
||||
:ivar state_reason: The reason for the most recent state transition.
|
||||
:ivar interfaces: List of Elastic Network Interfaces associated with
|
||||
this instance.
|
||||
:ivar ebs_optimized: Whether instance is using optimized EBS volumes
|
||||
or not.
|
||||
:ivar instance_profile: A Python dict containing the instance
|
||||
profile id and arn associated with this instance.
|
||||
"""
|
||||
|
||||
def __init__(self, connection=None):
|
||||
super(Instance, self).__init__(connection)
|
||||
self.id = None
|
||||
self.dns_name = None
|
||||
self.public_dns_name = None
|
||||
self.private_dns_name = None
|
||||
self.key_name = None
|
||||
self.instance_type = None
|
||||
self.launch_time = None
|
||||
self.image_id = None
|
||||
self.kernel = None
|
||||
self.ramdisk = None
|
||||
self.product_codes = ProductCodes()
|
||||
self.ami_launch_index = None
|
||||
self.monitored = False
|
||||
self.monitoring_state = None
|
||||
self.spot_instance_request_id = None
|
||||
self.subnet_id = None
|
||||
self.vpc_id = None
|
||||
self.private_ip_address = None
|
||||
self.ip_address = None
|
||||
self.requester_id = None
|
||||
self._in_monitoring_element = False
|
||||
self.persistent = False
|
||||
self.root_device_name = None
|
||||
self.root_device_type = None
|
||||
self.block_device_mapping = None
|
||||
self.state_reason = None
|
||||
self.group_name = None
|
||||
self.client_token = None
|
||||
self.eventsSet = None
|
||||
self.groups = []
|
||||
self.platform = None
|
||||
self.interfaces = []
|
||||
self.hypervisor = None
|
||||
self.virtualization_type = None
|
||||
self.architecture = None
|
||||
self.instance_profile = None
|
||||
self._previous_state = None
|
||||
self._state = InstanceState()
|
||||
self._placement = InstancePlacement()
|
||||
|
||||
def __repr__(self):
|
||||
return "Instance:%s" % self.id
|
||||
|
||||
@property
|
||||
def state(self):
|
||||
return self._state.name
|
||||
|
||||
@property
|
||||
def state_code(self):
|
||||
return self._state.code
|
||||
|
||||
@property
|
||||
def placement(self):
|
||||
return self._placement.zone
|
50
moto/packages/boto/ec2/instancetype.py
Normal file
50
moto/packages/boto/ec2/instancetype.py
Normal file
@ -0,0 +1,50 @@
|
||||
# Copyright (c) 2006-2009 Mitch Garnaat http://garnaat.org/
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
|
||||
from moto.packages.boto.ec2.ec2object import EC2Object
|
||||
|
||||
|
||||
class InstanceType(EC2Object):
|
||||
"""
|
||||
Represents an EC2 VM Type
|
||||
|
||||
:ivar name: The name of the vm type
|
||||
:ivar cores: The number of cpu cores for this vm type
|
||||
:ivar memory: The amount of memory in megabytes for this vm type
|
||||
:ivar disk: The amount of disk space in gigabytes for this vm type
|
||||
"""
|
||||
|
||||
def __init__(self, connection=None, name=None, cores=None, memory=None, disk=None):
|
||||
super(InstanceType, self).__init__(connection)
|
||||
self.connection = connection
|
||||
self.name = name
|
||||
self.cores = cores
|
||||
self.memory = memory
|
||||
self.disk = disk
|
||||
|
||||
def __repr__(self):
|
||||
return "InstanceType:%s-%s,%s,%s" % (
|
||||
self.name,
|
||||
self.cores,
|
||||
self.memory,
|
||||
self.disk,
|
||||
)
|
48
moto/packages/boto/ec2/launchspecification.py
Normal file
48
moto/packages/boto/ec2/launchspecification.py
Normal file
@ -0,0 +1,48 @@
|
||||
# Copyright (c) 2006-2012 Mitch Garnaat http://garnaat.org/
|
||||
# Copyright (c) 2012 Amazon.com, Inc. or its affiliates. All Rights Reserved
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
"""
|
||||
Represents a launch specification for Spot instances.
|
||||
"""
|
||||
|
||||
from moto.packages.boto.ec2.ec2object import EC2Object
|
||||
|
||||
|
||||
class LaunchSpecification(EC2Object):
|
||||
def __init__(self, connection=None):
|
||||
super(LaunchSpecification, self).__init__(connection)
|
||||
self.key_name = None
|
||||
self.instance_type = None
|
||||
self.image_id = None
|
||||
self.groups = []
|
||||
self.placement = None
|
||||
self.kernel = None
|
||||
self.ramdisk = None
|
||||
self.monitored = False
|
||||
self.subnet_id = None
|
||||
self._in_monitoring_element = False
|
||||
self.block_device_mapping = None
|
||||
self.instance_profile = None
|
||||
self.ebs_optimized = False
|
||||
|
||||
def __repr__(self):
|
||||
return "LaunchSpecification(%s)" % self.image_id
|
85
moto/packages/boto/ec2/spotinstancerequest.py
Normal file
85
moto/packages/boto/ec2/spotinstancerequest.py
Normal file
@ -0,0 +1,85 @@
|
||||
# Copyright (c) 2006-2010 Mitch Garnaat http://garnaat.org/
|
||||
# Copyright (c) 2010, Eucalyptus Systems, Inc.
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
"""
|
||||
Represents an EC2 Spot Instance Request
|
||||
"""
|
||||
|
||||
from moto.packages.boto.ec2.ec2object import TaggedEC2Object
|
||||
|
||||
|
||||
class SpotInstanceRequest(TaggedEC2Object):
|
||||
"""
|
||||
|
||||
:ivar id: The ID of the Spot Instance Request.
|
||||
:ivar price: The maximum hourly price for any Spot Instance launched to
|
||||
fulfill the request.
|
||||
:ivar type: The Spot Instance request type.
|
||||
:ivar state: The state of the Spot Instance request.
|
||||
:ivar fault: The fault codes for the Spot Instance request, if any.
|
||||
:ivar valid_from: The start date of the request. If this is a one-time
|
||||
request, the request becomes active at this date and time and remains
|
||||
active until all instances launch, the request expires, or the request is
|
||||
canceled. If the request is persistent, the request becomes active at this
|
||||
date and time and remains active until it expires or is canceled.
|
||||
:ivar valid_until: The end date of the request. If this is a one-time
|
||||
request, the request remains active until all instances launch, the request
|
||||
is canceled, or this date is reached. If the request is persistent, it
|
||||
remains active until it is canceled or this date is reached.
|
||||
:ivar launch_group: The instance launch group. Launch groups are Spot
|
||||
Instances that launch together and terminate together.
|
||||
:ivar launched_availability_zone: foo
|
||||
:ivar product_description: The Availability Zone in which the bid is
|
||||
launched.
|
||||
:ivar availability_zone_group: The Availability Zone group. If you specify
|
||||
the same Availability Zone group for all Spot Instance requests, all Spot
|
||||
Instances are launched in the same Availability Zone.
|
||||
:ivar create_time: The time stamp when the Spot Instance request was
|
||||
created.
|
||||
:ivar launch_specification: Additional information for launching instances.
|
||||
:ivar instance_id: The instance ID, if an instance has been launched to
|
||||
fulfill the Spot Instance request.
|
||||
:ivar status: The status code and status message describing the Spot
|
||||
Instance request.
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, connection=None):
|
||||
super(SpotInstanceRequest, self).__init__(connection)
|
||||
self.id = None
|
||||
self.price = None
|
||||
self.type = None
|
||||
self.state = None
|
||||
self.fault = None
|
||||
self.valid_from = None
|
||||
self.valid_until = None
|
||||
self.launch_group = None
|
||||
self.launched_availability_zone = None
|
||||
self.product_description = None
|
||||
self.availability_zone_group = None
|
||||
self.create_time = None
|
||||
self.launch_specification = None
|
||||
self.instance_id = None
|
||||
self.status = None
|
||||
|
||||
def __repr__(self):
|
||||
return "SpotInstanceRequest:%s" % self.id
|
35
moto/packages/boto/ec2/tag.py
Normal file
35
moto/packages/boto/ec2/tag.py
Normal file
@ -0,0 +1,35 @@
|
||||
# Copyright (c) 2010 Mitch Garnaat http://garnaat.org/
|
||||
# Copyright (c) 2010, Eucalyptus Systems, Inc.
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
|
||||
class TagSet(dict):
|
||||
"""
|
||||
A TagSet is used to collect the tags associated with a particular
|
||||
EC2 resource. Not all resources can be tagged but for those that
|
||||
can, this dict object will be used to collect those values. See
|
||||
:class:`boto.ec2.ec2object.TaggedEC2Object` for more details.
|
||||
"""
|
||||
|
||||
def __init__(self, connection=None):
|
||||
self.connection = connection
|
||||
self._current_key = None
|
||||
self._current_value = None
|
@ -1,6 +1,6 @@
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import boto.rds
|
||||
from boto3 import Session
|
||||
from jinja2 import Template
|
||||
|
||||
from moto.core import BaseBackend, CloudFormationModel
|
||||
@ -335,6 +335,10 @@ class RDSBackend(BaseBackend):
|
||||
return rds2_backends[self.region]
|
||||
|
||||
|
||||
rds_backends = dict(
|
||||
(region.name, RDSBackend(region.name)) for region in boto.rds.regions()
|
||||
)
|
||||
rds_backends = {}
|
||||
for region in Session().get_available_regions("rds"):
|
||||
rds_backends[region] = RDSBackend(region)
|
||||
for region in Session().get_available_regions("rds", partition_name="aws-us-gov"):
|
||||
rds_backends[region] = RDSBackend(region)
|
||||
for region in Session().get_available_regions("rds", partition_name="aws-cn"):
|
||||
rds_backends[region] = RDSBackend(region)
|
||||
|
1
setup.py
1
setup.py
@ -32,7 +32,6 @@ def get_version():
|
||||
|
||||
|
||||
install_requires = [
|
||||
"boto>=2.36.0",
|
||||
"boto3>=1.9.201",
|
||||
"botocore>=1.12.201",
|
||||
"cryptography>=2.3.0",
|
||||
|
@ -15,7 +15,7 @@ from moto.cloudformation.parsing import (
|
||||
from moto.sqs.models import Queue
|
||||
from moto.s3.models import FakeBucket
|
||||
from moto.cloudformation.utils import yaml_tag_constructor
|
||||
from boto.cloudformation.stack import Output
|
||||
from moto.packages.boto.cloudformation.stack import Output
|
||||
|
||||
|
||||
dummy_template = {
|
||||
|
@ -2,6 +2,9 @@ from moto import mock_cloudformation_deprecated, mock_ec2_deprecated
|
||||
from moto import mock_cloudformation, mock_ec2
|
||||
from tests.test_cloudformation.fixtures import vpc_eni
|
||||
import boto
|
||||
import boto.ec2
|
||||
import boto.cloudformation
|
||||
import boto.vpc
|
||||
import boto3
|
||||
import json
|
||||
import sure # noqa
|
||||
|
Loading…
Reference in New Issue
Block a user