diff options
-rw-r--r-- | src/plugins/docker/dockerdevice.cpp | 94 | ||||
-rw-r--r-- | src/plugins/docker/dockerdevice.h | 9 | ||||
-rw-r--r-- | src/plugins/docker/dockerdevicewidget.cpp | 6 |
3 files changed, 108 insertions, 1 deletions
diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index 75c5ac7b065..5b3380d7ea2 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -684,6 +684,8 @@ DockerDevice::DockerDevice() allowEmptyCommand.setValue(true); + portMappings.setSettingsKey("Ports"); + setDisplayType(Tr::tr("Docker")); setOsType(OsTypeLinux); setupId(IDevice::ManuallyAdded); @@ -971,6 +973,7 @@ CommandLine DockerDevicePrivate::createCommandLine() } dockerCreate.addArgs(createMountArgs()); + dockerCreate.addArgs(q->portMappings.createArguments()); if (!q->keepEntryPoint()) dockerCreate.addArgs({"--entrypoint", "/bin/sh"}); @@ -1420,4 +1423,95 @@ std::optional<FilePath> DockerDevice::clangdExecutable() const return d->clangdExecutable(); } +class PortMapping : public Utils::AspectContainer +{ +public: + PortMapping(); + + void addToLayoutImpl(Layouting::Layout &parent) override; + + Utils::StringAspect ip{this}; + Utils::IntegerAspect hostPort{this}; + Utils::IntegerAspect containerPort{this}; + Utils::SelectionAspect protocol{this}; +}; + +PortMapping::PortMapping() +{ + ip.setSettingsKey("HostIp"); + ip.setDefaultValue("0.0.0.0"); + ip.setToolTip(Tr::tr("Host IP")); + ip.setLabelText(Tr::tr("Host IP:")); + ip.setDisplayStyle(StringAspect::LineEditDisplay); + + hostPort.setSettingsKey("HostPort"); + hostPort.setToolTip(Tr::tr("Host Port")); + hostPort.setRange(1, 65535); + hostPort.setDefaultValue(8080); + hostPort.setLabelText(Tr::tr("Host Port:")); + + containerPort.setSettingsKey("ContainerPort"); + containerPort.setToolTip(Tr::tr("Container Port")); + containerPort.setRange(1, 65535); + containerPort.setDefaultValue(8080); + containerPort.setLabelText(Tr::tr("Container Port:")); + + protocol.setSettingsKey("Protocol"); + protocol.setToolTip(Tr::tr("Protocol")); + protocol.addOption("tcp", "TCP"); + protocol.addOption("udp", "UDP"); + protocol.setDefaultValue("tcp"); + protocol.setDisplayStyle(SelectionAspect::DisplayStyle::ComboBox); + protocol.setLabelText(Tr::tr("Protocol:")); + + for (const auto &aspect : aspects()) { + connect(aspect, &BaseAspect::changed, this, &PortMapping::changed); + } +} + +void PortMapping::addToLayoutImpl(Layouting::Layout &parent) +{ + using namespace Layouting; + + parent.addItem(ip); + parent.addItem(hostPort); + parent.addItem(containerPort); + parent.addItem(protocol); +} + +PortMappings::PortMappings(Utils::AspectContainer *container) + : AspectList(container) +{ + setCreateItemFunction([this]() { + auto mapping = std::make_unique<PortMapping>(); + connect(mapping.get(), &PortMapping::changed, this, &AspectContainer::changed); + return mapping; + }); +} + +QStringList PortMappings::createArguments() const +{ + QStringList cmds; + + forEachItem<PortMapping>([&cmds](const std::shared_ptr<PortMapping> &portMapping) { + if (portMapping->ip().isEmpty()) { + cmds + += {"-p", + QString("%1:%2/%3") + .arg(portMapping->hostPort()) + .arg(portMapping->containerPort()) + .arg(portMapping->protocol.stringValue())}; + return; + } + cmds + += {"-p", + QString("%1:%2:%3/%4") + .arg(portMapping->ip()) + .arg(portMapping->hostPort()) + .arg(portMapping->containerPort()) + .arg(portMapping->protocol.stringValue())}; + }); + + return cmds; +} } // namespace Docker::Internal diff --git a/src/plugins/docker/dockerdevice.h b/src/plugins/docker/dockerdevice.h index 3f9e8455d85..3a3cf92115c 100644 --- a/src/plugins/docker/dockerdevice.h +++ b/src/plugins/docker/dockerdevice.h @@ -14,6 +14,14 @@ namespace Docker::Internal { +class PortMappings : public Utils::AspectList +{ +public: + PortMappings(Utils::AspectContainer *container); + + QStringList createArguments() const; +}; + class DockerDevice : public ProjectExplorer::IDevice { public: @@ -71,6 +79,7 @@ public: Utils::StringSelectionAspect network{this}; Utils::StringAspect extraArgs{this}; DockerDeviceEnvironmentAspect environment{this}; + PortMappings portMappings{this}; Utils::TextDisplay containerStatus{this}; diff --git a/src/plugins/docker/dockerdevicewidget.cpp b/src/plugins/docker/dockerdevicewidget.cpp index 07e2075f8ec..9512dcf21ef 100644 --- a/src/plugins/docker/dockerdevicewidget.cpp +++ b/src/plugins/docker/dockerdevicewidget.cpp @@ -184,6 +184,10 @@ DockerDeviceWidget::DockerDeviceWidget(const IDevice::Ptr &device) pathListLabel, dockerDevice->mounts, }, br, + Column { + Tr::tr("Port Mappings:"), + dockerDevice->portMappings, + }, br, If { dockerDevice->isAutoDetected(), {}, {detectionControls} }, },br, Tr::tr("Command line:"), createLineLabel, br, @@ -218,4 +222,4 @@ void DockerDeviceWidget::updateDaemonStateTexts() } } -} // Docker::Internal +} // namespace Docker::Internal |