fix(volumes): enable volume browsing (#4233)

* fix(docker): browse an agent volume

* refactor(volumes): get resource id from endpoint
pull/4250/head
Chaim Lev-Ari 2020-08-20 15:29:46 +03:00 committed by GitHub
parent f8be9bb57a
commit 9fd38a0543
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 27 additions and 7 deletions

View File

@ -156,8 +156,14 @@ func (transport *Transport) proxyAgentRequest(r *http.Request) (*http.Response,
return transport.administratorOperation(r) return transport.administratorOperation(r)
} }
agentTargetHeader := r.Header.Get(portainer.PortainerAgentTargetHeader)
resourceID, err := transport.getVolumeResourceID(agentTargetHeader, volumeIDParameter[0])
if err != nil {
return nil, err
}
// volume browser request // volume browser request
return transport.restrictedResourceOperation(r, volumeIDParameter[0], portainer.VolumeResourceControl, true) return transport.restrictedResourceOperation(r, resourceID, portainer.VolumeResourceControl, true)
} }
return transport.executeDockerRequest(r) return transport.executeDockerRequest(r)

View File

@ -168,16 +168,30 @@ func (transport *Transport) restrictedVolumeOperation(requestPath string, reques
return transport.rewriteOperation(request, transport.volumeInspectOperation) return transport.rewriteOperation(request, transport.volumeInspectOperation)
} }
cli := transport.dockerClient agentTargetHeader := request.Header.Get(portainer.PortainerAgentTargetHeader)
volume, err := cli.VolumeInspect(context.Background(), path.Base(requestPath))
resourceID, err := transport.getVolumeResourceID(agentTargetHeader, path.Base(requestPath))
if err != nil { if err != nil {
return nil, err return nil, err
} }
volumeID := volume.Name + volume.CreatedAt
if request.Method == http.MethodDelete { if request.Method == http.MethodDelete {
return transport.executeGenericResourceDeletionOperation(request, volumeID, portainer.VolumeResourceControl) return transport.executeGenericResourceDeletionOperation(request, resourceID, portainer.VolumeResourceControl)
} }
return transport.restrictedResourceOperation(request, volumeID, portainer.VolumeResourceControl, false) return transport.restrictedResourceOperation(request, resourceID, portainer.VolumeResourceControl, false)
}
func (transport *Transport) getVolumeResourceID(nodename, volumeID string) (string, error) {
cli, err := transport.dockerClientFactory.CreateClient(transport.endpoint, nodename)
if err != nil {
return "", err
}
defer cli.Close()
volume, err := cli.VolumeInspect(context.Background(), volumeID)
if err != nil {
return "", err
}
return volume.Name + volume.CreatedAt, nil
} }