From 0b131fae72e98a0630e4a8a739374023224430d5 Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 8 Feb 2022 09:41:46 +0100 Subject: [PATCH] Docker: Use repo + tag for image identification Makes configurations a bit better exchangable (sdktool...). Change-Id: Ia566a516afea2205c973527e02ce5664634ebbdc Reviewed-by: Christian Stenger --- src/plugins/docker/dockerbuildstep.cpp | 12 ++++- src/plugins/docker/dockerdevice.cpp | 70 +++++++++++++++++--------- src/plugins/docker/dockerdevice.h | 5 +- 3 files changed, 60 insertions(+), 27 deletions(-) diff --git a/src/plugins/docker/dockerbuildstep.cpp b/src/plugins/docker/dockerbuildstep.cpp index 52c6c6cf45f..1970147569a 100644 --- a/src/plugins/docker/dockerbuildstep.cpp +++ b/src/plugins/docker/dockerbuildstep.cpp @@ -94,10 +94,20 @@ private: { MacroExpander *expander = target()->kit()->macroExpander(); expander->registerVariable("BuildDevice:DockerImage", - "Build Host Docker Image ID", [=]() -> QString { + "Build Host Docker Image ID", [this] { const DockerDevice *dockerDevice = dockerBuildDevice(); return dockerDevice ? dockerDevice->data().imageId : QString(); }, true); + expander->registerVariable("BuildDevice:DockerRepo", + "Build Host Docker Repo", [this] { + const DockerDevice *dockerDevice = dockerBuildDevice(); + return dockerDevice ? dockerDevice->data().repo : QString(); + }, true); + expander->registerVariable("BuildDevice:DockerTag", + "Build Host Docker Tag", [this] { + const DockerDevice *dockerDevice = dockerBuildDevice(); + return dockerDevice ? dockerDevice->data().tag : QString(); + }, true); return expander; } diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index daba1b235a2..22428aea254 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -307,16 +307,21 @@ public: DockerDeviceData &data = dockerDevice->data(); - auto idLabel = new QLabel(tr("Image ID:")); - m_idLineEdit = new QLineEdit; - m_idLineEdit->setText(data.imageId); - m_idLineEdit->setEnabled(false); - auto repoLabel = new QLabel(tr("Repository:")); m_repoLineEdit = new QLineEdit; m_repoLineEdit->setText(data.repo); m_repoLineEdit->setEnabled(false); + auto tagLabel = new QLabel(tr("Tag:")); + m_tagLineEdit = new QLineEdit; + m_tagLineEdit->setText(data.tag); + m_tagLineEdit->setEnabled(false); + + auto idLabel = new QLabel(tr("Image ID:")); + m_idLineEdit = new QLineEdit; + m_idLineEdit->setText(data.imageId); + m_idLineEdit->setEnabled(false); + auto daemonStateLabel = new QLabel(tr("Daemon state:")); m_daemonReset = new QToolButton; m_daemonReset->setToolTip(tr("Clears detected daemon state. " @@ -399,11 +404,11 @@ public: }; connect(autoDetectButton, &QPushButton::clicked, this, - [this, logView, id = data.id(), dockerDevice, searchPaths] { + [this, logView, data, dockerDevice, searchPaths] { logView->clear(); dockerDevice->updateContainerAccess(); - m_kitItemDetector.autoDetect(id, searchPaths()); + m_kitItemDetector.autoDetect(data.autodetectId(), searchPaths()); if (DockerPlugin::isDaemonRunning().value_or(false) == false) logView->append(tr("Docker daemon appears to be not running.")); @@ -412,21 +417,22 @@ public: updateDaemonStateTexts(); }); - connect(undoAutoDetectButton, &QPushButton::clicked, this, [this, logView, id = data.id()] { + connect(undoAutoDetectButton, &QPushButton::clicked, this, [this, logView, data] { logView->clear(); - m_kitItemDetector.undoAutoDetect(id); + m_kitItemDetector.undoAutoDetect(data.autodetectId()); }); - connect(listAutoDetectedButton, &QPushButton::clicked, this, [this, logView, id = data.id()] { + connect(listAutoDetectedButton, &QPushButton::clicked, this, [this, logView, data] { logView->clear(); - m_kitItemDetector.listAutoDetected(id); + m_kitItemDetector.listAutoDetected(data.autodetectId()); }); using namespace Layouting; Form { - idLabel, m_idLineEdit, Break(), repoLabel, m_repoLineEdit, Break(), + tagLabel, m_tagLineEdit, Break(), + idLabel, m_idLineEdit, Break(), daemonStateLabel, m_daemonReset, m_daemonState, Break(), m_runAsOutsideUser, Break(), #ifdef ALLOW_LOCAL_ACCESS @@ -465,8 +471,9 @@ public: void updateDaemonStateTexts(); private: - QLineEdit *m_idLineEdit; QLineEdit *m_repoLineEdit; + QLineEdit *m_tagLineEdit; + QLineEdit *m_idLineEdit; QToolButton *m_daemonReset; QLabel *m_daemonState; QCheckBox *m_runAsOutsideUser; @@ -496,6 +503,19 @@ Tasks DockerDevice::validate() const } +// DockerDeviceData + +QString DockerDeviceData::dockerId() const +{ + if (repo == "") + return imageId; + + if (tag == "") + return repo; + + return repo + ':' + tag; +} + // DockerDevice DockerDevice::DockerDevice(const DockerDeviceData &data) @@ -506,7 +526,7 @@ DockerDevice::DockerDevice(const DockerDeviceData &data) setDisplayType(tr("Docker")); setOsType(OsTypeOtherUnix); setDefaultDisplayName(tr("Docker Image"));; - setDisplayName(tr("Docker Image \"%1\" (%2)").arg(data.repo).arg(data.imageId)); + setDisplayName(tr("Docker Image \"%1\" (%2)").arg(data.dockerId()).arg(data.imageId)); setAllowEmptyCommand(true); setOpenTerminal([this](const Environment &env, const FilePath &workingDir) { @@ -865,7 +885,7 @@ void DockerDevicePrivate::startContainer() dockerCreate.addArgs({"-v", q->debugDumperPath().toUserOutput() + ':' + dumperPath.path()}); q->setDebugDumperPath(dumperPath); - dockerCreate.addArgs({"--entrypoint", "/bin/sh", m_data.imageId}); + dockerCreate.addArgs({"--entrypoint", "/bin/sh", m_data.dockerId()}); LOG("RUNNING: " << dockerCreate.toUserOutput()); QtcProcess createProcess; @@ -1044,9 +1064,9 @@ const char DockerDeviceMappedPaths[] = "DockerDeviceMappedPaths"; void DockerDevice::fromMap(const QVariantMap &map) { ProjectExplorer::IDevice::fromMap(map); - d->m_data.imageId = map.value(DockerDeviceDataImageIdKey).toString(); d->m_data.repo = map.value(DockerDeviceDataRepoKey).toString(); d->m_data.tag = map.value(DockerDeviceDataTagKey).toString(); + d->m_data.imageId = map.value(DockerDeviceDataImageIdKey).toString(); d->m_data.size = map.value(DockerDeviceDataSizeKey).toString(); d->m_data.useLocalUidGid = map.value(DockerDeviceUseOutsideUser, HostOsInfo::isLinuxHost()).toBool(); @@ -1058,9 +1078,9 @@ void DockerDevice::fromMap(const QVariantMap &map) QVariantMap DockerDevice::toMap() const { QVariantMap map = ProjectExplorer::IDevice::toMap(); - map.insert(DockerDeviceDataImageIdKey, d->m_data.imageId); map.insert(DockerDeviceDataRepoKey, d->m_data.repo); map.insert(DockerDeviceDataTagKey, d->m_data.tag); + map.insert(DockerDeviceDataImageIdKey, d->m_data.imageId); map.insert(DockerDeviceDataSizeKey, d->m_data.size); map.insert(DockerDeviceUseOutsideUser, d->m_data.useLocalUidGid); map.insert(DockerDeviceUseFilePathMapping, d->m_data.useFilePathMapping); @@ -1112,7 +1132,7 @@ FilePath DockerDevice::mapToGlobalPath(const FilePath &pathOnDevice) const } FilePath result; result.setScheme("docker"); - result.setHost(d->m_data.imageId); + result.setHost(d->m_data.dockerId()); result.setPath(pathOnDevice.path()); return result; } @@ -1132,7 +1152,7 @@ QString DockerDevice::mapToDevicePath(const Utils::FilePath &globalPath) const bool DockerDevice::handlesFile(const FilePath &filePath) const { - return filePath.scheme() == "docker" && filePath.host() == d->m_data.imageId; + return filePath.scheme() == "docker" && filePath.host() == d->m_data.dockerId(); } bool DockerDevice::isExecutableFile(const FilePath &filePath) const @@ -1682,7 +1702,7 @@ Environment DockerDevice::systemEnvironment() const void DockerDevice::aboutToBeRemoved() const { KitDetector detector(sharedFromThis()); - detector.undoAutoDetect(d->m_data.id()); + detector.undoAutoDetect(d->m_data.autodetectId()); } void DockerDevicePrivate::fetchSystemEnviroment() @@ -1785,15 +1805,15 @@ public: switch (column) { case 0: if (role == Qt::DisplayRole) - return imageId; + return repo; break; case 1: if (role == Qt::DisplayRole) - return repo; + return tag; break; case 2: if (role == Qt::DisplayRole) - return tag; + return imageId; break; case 3: if (role == Qt::DisplayRole) @@ -1814,7 +1834,7 @@ public: setWindowTitle(DockerDevice::tr("Docker Image Selection")); resize(800, 600); - m_model.setHeader({"Image", "Repository", "Tag", "Size"}); + m_model.setHeader({"Repository", "Tag", "Image", "Size"}); m_view = new TreeView; m_view->setModel(&m_model); @@ -1886,7 +1906,7 @@ public: QTC_ASSERT(item, return {}); auto device = DockerDevice::create(*item); - device->setupId(IDevice::ManuallyAdded, Id::fromString(item->id())); + device->setupId(IDevice::ManuallyAdded, Id::fromString(item->autodetectId())); device->setType(Constants::DOCKER_DEVICE_TYPE); device->setMachineType(IDevice::Hardware); diff --git a/src/plugins/docker/dockerdevice.h b/src/plugins/docker/dockerdevice.h index 9ead0c5c102..6b2cca21a68 100644 --- a/src/plugins/docker/dockerdevice.h +++ b/src/plugins/docker/dockerdevice.h @@ -37,7 +37,10 @@ namespace Internal { class DockerDeviceData { public: - QString id() const { return "docker:" + imageId; } + // Used for "docker run" and for host parts of FilePaths + QString dockerId() const; + // Used as autodetection source string + QString autodetectId() const { return "docker:" + dockerId(); } QString imageId; QString repo;