Docker Json command is split between entrypoint and command properties. Compute a command
out of those to fit the LXC container XML configuration.
---
src/lxc/lxc_native_docker.c | 65 ++++++++++++++++++++++
.../dockerjson2xmldata-command.json | 50 +++++++++++++++++
.../dockerjson2xmldata-command.xml | 17 ++++++
tests/dockerjson2xmltest.c | 1 +
4 files changed, 133 insertions(+)
create mode 100644 tests/dockerjson2xmldata/dockerjson2xmldata-command.json
create mode 100644 tests/dockerjson2xmldata/dockerjson2xmldata-command.xml
diff --git a/src/lxc/lxc_native_docker.c b/src/lxc/lxc_native_docker.c
index a278309..618446d 100644
--- a/src/lxc/lxc_native_docker.c
+++ b/src/lxc/lxc_native_docker.c
@@ -66,12 +66,70 @@ static int dockerParseMem(virDomainDefPtr dom,
return 0;
}
+struct dockerCmdArgsIteratorArgs {
+ virDomainDefPtr vmdef;
+ size_t ninitargs;
+};
+
+static int dockerCmdArgsIterator(size_t pos ATTRIBUTE_UNUSED,
+ virJSONValuePtr item,
+ void *opaque)
+{
+ struct dockerCmdArgsIteratorArgs *args = opaque;
+ const char *value = virJSONValueGetString(item);
+
+ if (!args->vmdef->os.init) {
+ if (VIR_STRDUP(args->vmdef->os.init, value) < 0)
+ return -1;
+ else
+ return 1;
+ }
+
+ if (VIR_EXPAND_N(args->vmdef->os.initargv, args->ninitargs, 1) < 0)
+ return -1;
+
+ if (VIR_STRDUP(args->vmdef->os.initargv[args->ninitargs - 1], value) <
0)
+ return -1;
+
+ return 1;
+}
+
+
+static int dockerBuildInitCmd(virDomainDefPtr vmdef,
+ virJSONValuePtr config)
+{
+ virJSONValuePtr entry_point = virJSONValueObjectGetArray(config,
"Entrypoint");
+ virJSONValuePtr command = virJSONValueObjectGetArray(config, "Cmd");
+ struct dockerCmdArgsIteratorArgs iterator_args = { vmdef, 0 };
+
+ if (entry_point && virJSONValueArrayForeachSteal(entry_point,
+ &dockerCmdArgsIterator,
+ &iterator_args) < 0)
+ goto error;
+
+ if (command && virJSONValueArrayForeachSteal(command,
+ &dockerCmdArgsIterator,
+ &iterator_args) < 0)
+ goto error;
+
+ /* Append NULL element at the end */
+ if (iterator_args.ninitargs > 0 &&
+ VIR_EXPAND_N(vmdef->os.initargv, iterator_args.ninitargs, 1) < 0)
+ goto error;
+
+ return 0;
+
+ error:
+ return -1;
+}
+
virDomainDefPtr dockerParseJSONConfig(virCapsPtr caps ATTRIBUTE_UNUSED,
virDomainXMLOptionPtr xmlopt,
const char *config)
{
virJSONValuePtr json_obj;
virJSONValuePtr host_config;
+ virJSONValuePtr docker_config;
if (!(json_obj = virJSONValueFromString(config)))
return NULL;
@@ -97,6 +155,13 @@ virDomainDefPtr dockerParseJSONConfig(virCapsPtr caps
ATTRIBUTE_UNUSED,
}
}
+ if ((docker_config = virJSONValueObjectGetObject(json_obj, "Config")) !=
NULL) {
+ if (dockerBuildInitCmd(def, docker_config) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("failed to
parse Command"));
+ goto error;
+ }
+ }
+
def->clock.offset = VIR_DOMAIN_CLOCK_OFFSET_UTC;
def->onReboot = VIR_DOMAIN_LIFECYCLE_RESTART;
def->onCrash = VIR_DOMAIN_LIFECYCLE_CRASH_DESTROY;
diff --git a/tests/dockerjson2xmldata/dockerjson2xmldata-command.json
b/tests/dockerjson2xmldata/dockerjson2xmldata-command.json
new file mode 100644
index 0000000..d20419d
--- /dev/null
+++ b/tests/dockerjson2xmldata/dockerjson2xmldata-command.json
@@ -0,0 +1,50 @@
+{
+ "Id":
"618a2e773b84976ca2736e443a0c98eeeecdcfb2584e3dab1a3cafa313a936da",
+ "Created": "2017-06-07T00:46:07.149971669Z",
+ "Path": "/bin/ping",
+ "Args": [
+ "localhost"
+ ],
+ "HostConfig": {
+ "LogConfig": {
+ "Type": "json-file",
+ "Config": {}
+ },
+ "NetworkMode": "default",
+ "PortBindings": {},
+ "RestartPolicy": {
+ "Name": "no",
+ "MaximumRetryCount": 0
+ },
+ "ShmSize": 67108864,
+ "CpuShares": 0,
+ "Memory": 0,
+ "MemorySwap": 0,
+ "MemorySwappiness": -1,
+ "CpuCount": 0,
+ "CpuPercent": 0,
+ "IOMaximumBandwidth": 0
+ },
+ "GraphDriver": {
+ "Name": "aufs",
+ "Data": null
+ },
+ "Mounts": [],
+ "Config": {
+ "Hostname": "618a2e773b84",
+ "Domainname": "",
+ "User": "",
+ "Env": [
+
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
+ ],
+ "Cmd": [
+ "/bin/ping",
+ "localhost"
+ ],
+ "WorkingDir": "",
+ "Entrypoint": null,
+ "OnBuild": null,
+ "Labels": {}
+ }
+
+}
diff --git a/tests/dockerjson2xmldata/dockerjson2xmldata-command.xml
b/tests/dockerjson2xmldata/dockerjson2xmldata-command.xml
new file mode 100644
index 0000000..52155d1
--- /dev/null
+++ b/tests/dockerjson2xmldata/dockerjson2xmldata-command.xml
@@ -0,0 +1,17 @@
+<domain type='lxc'>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>0</memory>
+ <currentMemory unit='KiB'>0</currentMemory>
+ <vcpu placement='static'>0</vcpu>
+ <os>
+ <type>exe</type>
+ <init>/bin/ping</init>
+ <initarg>localhost</initarg>
+ </os>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ </devices>
+</domain>
diff --git a/tests/dockerjson2xmltest.c b/tests/dockerjson2xmltest.c
index 41c46a1..de7f77a 100644
--- a/tests/dockerjson2xmltest.c
+++ b/tests/dockerjson2xmltest.c
@@ -107,6 +107,7 @@ mymain(void)
} while (0)
DO_TEST("simple", true);
+ DO_TEST("command", true);
virObjectUnref(xmlopt);
virObjectUnref(caps);
--
2.7.4