Fix handle_restore for server and volume resources

When resource references are used for properties restore
does not work for nova server and volume resources.

This patch fixes it and adds a functional test for it.

Change-Id: I34efb3f4e0d3578d95134793f5c5d413667790e0
Closes-Bug: #1687009
diff --git a/functional/test_snapshot_restore.py b/functional/test_snapshot_restore.py
new file mode 100644
index 0000000..f63a360
--- /dev/null
+++ b/functional/test_snapshot_restore.py
@@ -0,0 +1,76 @@
+#    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.
+
+
+from heat_integrationtests.functional import functional_base
+
+
+class StackSnapshotRestoreTest(functional_base.FunctionalTestsBase):
+
+    def setUp(self):
+        super(StackSnapshotRestoreTest, self).setUp()
+        if not self.conf.minimal_image_ref:
+            raise self.skipException("No image configured to test")
+
+        if not self.conf.minimal_instance_type:
+            raise self.skipException(
+                "No minimal_instance_type configured to test")
+
+        self.assign_keypair()
+
+    def test_stack_snapshot_restore(self):
+        template = '''
+heat_template_version: ocata
+parameters:
+  keyname:
+    type: string
+  flavor:
+    type: string
+  image:
+    type: string
+  network:
+    type: string
+resources:
+  my_port:
+    type: OS::Neutron::Port
+    properties:
+      network: {get_param: network}
+  my_server:
+    type: OS::Nova::Server
+    properties:
+      image: {get_param: image}
+      flavor: {get_param: flavor}
+      key_name: {get_param: keyname}
+      networks: [{port: {get_resource: my_port} }]
+
+'''
+
+        def get_server_image(server_id):
+            server = self.compute_client.servers.get(server_id)
+            return server.image['id']
+
+        parameters = {'keyname': self.keypair_name,
+                      'flavor': self.conf.minimal_instance_type,
+                      'image': self.conf.minimal_image_ref,
+                      'network': self.conf.fixed_network_name}
+        stack_identifier = self.stack_create(template=template,
+                                             parameters=parameters)
+        server_resource = self.client.resources.get(
+            stack_identifier, 'my_server')
+        server_id = server_resource.physical_resource_id
+        prev_image_id = get_server_image(server_id)
+
+        # Do snapshot and restore
+        snapshot_id = self.stack_snapshot(stack_identifier)
+        self.stack_restore(stack_identifier, snapshot_id)
+
+        self.assertNotEqual(prev_image_id, get_server_image(server_id))