Move TestResource in-tree

Change-Id: I83c52f099621610f75c3b986c359292606978885
Closes-bug: #1489459
diff --git a/common/test_resources/test_resource.py b/common/test_resources/test_resource.py
deleted file mode 100644
index 92b09f1..0000000
--- a/common/test_resources/test_resource.py
+++ /dev/null
@@ -1,226 +0,0 @@
-#
-#    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 datetime
-import eventlet
-from oslo_utils import timeutils
-import six
-
-from heat.common.i18n import _
-from heat.engine import attributes
-from heat.engine import properties
-from heat.engine import resource
-from heat.engine import support
-from oslo_log import log as logging
-
-LOG = logging.getLogger(__name__)
-
-
-class TestResource(resource.Resource):
-    '''
-    A resource which stores the string value that was provided.
-
-    This resource is to be used only for testing.
-    It has control knobs such as 'update_replace', 'fail', 'wait_secs'
-
-    '''
-
-    support_status = support.SupportStatus(version='2014.1')
-
-    ACTION_TIMES = (
-        CREATE_WAIT_SECS, UPDATE_WAIT_SECS, DELETE_WAIT_SECS
-    ) = (
-        'create', 'update', 'delete')
-
-    PROPERTIES = (
-        VALUE, UPDATE_REPLACE, FAIL,
-        CLIENT_NAME, ENTITY_NAME,
-        WAIT_SECS, ACTION_WAIT_SECS
-    ) = (
-        'value', 'update_replace', 'fail',
-        'client_name', 'entity_name',
-        'wait_secs', 'action_wait_secs'
-    )
-
-    ATTRIBUTES = (
-        OUTPUT,
-    ) = (
-        'output',
-    )
-
-    properties_schema = {
-        VALUE: properties.Schema(
-            properties.Schema.STRING,
-            _('The input string to be stored.'),
-            default='test_string',
-            update_allowed=True
-        ),
-        FAIL: properties.Schema(
-            properties.Schema.BOOLEAN,
-            _('Value which can be set to fail the resource operation '
-              'to test failure scenarios.'),
-            update_allowed=True,
-            default=False
-        ),
-        UPDATE_REPLACE: properties.Schema(
-            properties.Schema.BOOLEAN,
-            _('Value which can be set to trigger update replace for '
-              'the particular resource'),
-            update_allowed=True,
-            default=False
-        ),
-        WAIT_SECS: properties.Schema(
-            properties.Schema.NUMBER,
-            _('Seconds to wait after an action (-1 is infinite)'),
-            update_allowed=True,
-            default=0,
-        ),
-        ACTION_WAIT_SECS: properties.Schema(
-            properties.Schema.MAP,
-            _('Options for simulating waiting.'),
-            update_allowed=True,
-            schema={
-                CREATE_WAIT_SECS: properties.Schema(
-                    properties.Schema.NUMBER,
-                    _('Seconds to wait after a create. '
-                      'Defaults to the global wait_secs'),
-                    update_allowed=True,
-                ),
-                UPDATE_WAIT_SECS: properties.Schema(
-                    properties.Schema.NUMBER,
-                    _('Seconds to wait after an update. '
-                      'Defaults to the global wait_secs'),
-                    update_allowed=True,
-                ),
-                DELETE_WAIT_SECS: properties.Schema(
-                    properties.Schema.NUMBER,
-                    _('Seconds to wait after a delete. '
-                      'Defaults to the global wait_secs'),
-                    update_allowed=True,
-                ),
-            }
-        ),
-        CLIENT_NAME: properties.Schema(
-            properties.Schema.STRING,
-            _('Client to poll.'),
-            default='',
-            update_allowed=True
-        ),
-        ENTITY_NAME: properties.Schema(
-            properties.Schema.STRING,
-            _('Client entity to poll.'),
-            default='',
-            update_allowed=True
-        ),
-    }
-
-    attributes_schema = {
-        OUTPUT: attributes.Schema(
-            _('The string that was stored. This value is '
-              'also available by referencing the resource.'),
-            cache_mode=attributes.Schema.CACHE_NONE
-        ),
-    }
-
-    def _wait_secs(self):
-        secs = None
-        if self.properties[self.ACTION_WAIT_SECS]:
-            secs = self.properties[self.ACTION_WAIT_SECS][self.action.lower()]
-        if secs is None:
-            secs = self.properties[self.WAIT_SECS]
-        LOG.info('%s wait_secs:%s, action:%s' % (self.name, secs,
-                                                 self.action.lower()))
-        return secs
-
-    def handle_create(self):
-        fail_prop = self.properties.get(self.FAIL)
-        if not fail_prop:
-            value = self.properties.get(self.VALUE)
-            self.data_set('value', value, redact=False)
-            self.resource_id_set(self.physical_resource_name())
-
-        return timeutils.utcnow(), self._wait_secs()
-
-    def handle_update(self, json_snippet=None, tmpl_diff=None, prop_diff=None):
-        self.properties = json_snippet.properties(self.properties_schema,
-                                                  self.context)
-        value = prop_diff.get(self.VALUE)
-        if value:
-            update_replace = self.properties[self.UPDATE_REPLACE]
-            if update_replace:
-                raise resource.UpdateReplace(self.name)
-            else:
-                # emulate failure
-                fail_prop = self.properties[self.FAIL]
-                if not fail_prop:
-                    # update in place
-                    self.data_set('value', value, redact=False)
-                return timeutils.utcnow(), self._wait_secs()
-        return timeutils.utcnow(), 0
-
-    def handle_delete(self):
-        return timeutils.utcnow(), self._wait_secs()
-
-    def check_create_complete(self, cookie):
-        return self._check_status_complete(*cookie)
-
-    def check_update_complete(self, cookie):
-        return self._check_status_complete(*cookie)
-
-    def check_delete_complete(self, cookie):
-        return self._check_status_complete(*cookie)
-
-    def _check_status_complete(self, started_at, wait_secs):
-        def simulated_effort():
-            client_name = self.properties[self.CLIENT_NAME]
-            self.entity = self.properties[self.ENTITY_NAME]
-            if client_name and self.entity:
-                # Allow the user to set the value to a real resource id.
-                entity_id = self.data().get('value') or self.resource_id
-                try:
-                    obj = getattr(self.client(name=client_name), self.entity)
-                    obj.get(entity_id)
-                except Exception as exc:
-                    LOG.debug('%s.%s(%s) %s' % (client_name, self.entity,
-                                                entity_id, six.text_type(exc)))
-            else:
-                # just sleep some more
-                eventlet.sleep(1)
-
-        if isinstance(started_at, six.string_types):
-            started_at = timeutils.parse_isotime(started_at)
-
-        started_at = timeutils.normalize_time(started_at)
-        waited = timeutils.utcnow() - started_at
-        LOG.info("Resource %s waited %s/%s seconds",
-                 self.name, waited, wait_secs)
-
-        # wait_secs < 0 is an infinite wait time.
-        if wait_secs >= 0 and waited > datetime.timedelta(seconds=wait_secs):
-            fail_prop = self.properties[self.FAIL]
-            if fail_prop and self.action != self.DELETE:
-                raise ValueError("Test Resource failed %s" % self.name)
-            return True
-
-        simulated_effort()
-        return False
-
-    def _resolve_attribute(self, name):
-        if name == self.OUTPUT:
-            return self.data().get('value')
-
-
-def resource_mapping():
-    return {
-        'OS::Heat::TestResource': TestResource,
-    }