forked from qt-creator/qt-creator
Docker: Use repo + tag for image identification
Makes configurations a bit better exchangable (sdktool...). Change-Id: Ia566a516afea2205c973527e02ce5664634ebbdc Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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 == "<none>")
|
||||
return imageId;
|
||||
|
||||
if (tag == "<none>")
|
||||
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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user