Commit 070f8098 authored by Stefano Alberto Russo's avatar Stefano Alberto Russo
Browse files

Added container duplicate capability.

parent 9c7e1eaa
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -125,9 +125,11 @@
       <tr>
        <td><b>Operations</b></td>
        <td>
          <a href="?action=delete&container_uuid={{ container.uuid }}">Delete</a>
          <a href="?action=delete&container_uuid={{ container.uuid }}" onclick="return confirm('Are you sure you want to delete this container?');">Delete</a>
          &nbsp;|&nbsp;
          <a href="/edit_software?container_uuid={{ container.uuid }}">Edit</a>
          &nbsp;|&nbsp;
          <a href="?action=duplicate&container_uuid={{ container.uuid }}" onclick="return confirm('Duplicate this container?');">Duplicate</a>
        </td>
       </tr>
       {% endif %}
+29 −0
Original line number Diff line number Diff line
@@ -808,6 +808,35 @@ def software(request):
                # Redirect
                return HttpResponseRedirect('/software')

            # Duplicate action
            if action and action=='duplicate':
                if not (request.user.is_staff or (container.user and container.user == request.user)):
                    data['error'] = 'You do not have permission to duplicate this container.'
                    return render(request, 'error.html', {'data': data})
                from copy import deepcopy
                new_container = Container(
                    user=container.user,
                    name=f"{container.name} (copy)",
                    description=container.description,
                    registry=container.registry,
                    image_name=container.image_name,
                    image_tag=container.image_tag,
                    image_arch=container.image_arch,
                    image_os=container.image_os,
                    image_digest=container.image_digest,
                    interface_port=container.interface_port,
                    interface_protocol=container.interface_protocol,
                    interface_transport=container.interface_transport,
                    supports_custom_interface_port=container.supports_custom_interface_port,
                    supports_interface_auth=container.supports_interface_auth,
                    interface_auth_user=container.interface_auth_user,
                    disable_http_basicauth_embedding=container.disable_http_basicauth_embedding,
                    env_vars=deepcopy(container.env_vars) if container.env_vars else None,
                    group=container.group
                )
                new_container.save()
                return redirect(f'/edit_software?container_uuid={new_container.uuid}')

        except Exception as e:
            data['error'] = 'Error in getting the software container or performing the required action'
            logger.error('Error in getting container with uuid="{}" or performing the required action: "{}"'.format(uuid, e))