Blame core/composer.js

Packit Service 0246ed
import cockpit from "cockpit";
Packit Service 0246ed
import providerSettings from "../data/providers";
Packit Service 0246ed
Packit Service 0246ed
const cockpitHttp = cockpit.http("/run/weldr/api.socket", { superuser: "try" });
Packit Service 0246ed
Packit Service 0246ed
/*
Packit Service 0246ed
 * Send a request to the composer API.
Packit Service 0246ed
 *
Packit Service 0246ed
 * `options` can contain `path`, `params`, `headers`, `body`, and
Packit Service 0246ed
 * `replyFormat`. The ones that have the same name as cockpit.http options
Packit Service 0246ed
 * correspond to them and are passed along.
Packit Service 0246ed
 *
Packit Service 0246ed
 * `replyFormat` can be set to "json" (the default) or "raw".
Packit Service 0246ed
 *
Packit Service 0246ed
 * All responses are expected to be either empty or valid JSON.
Packit Service 0246ed
 */
Packit Service 0246ed
function request(options) {
Packit Service 0246ed
  const replyFormat = options.replyFormat || "json";
Packit Service 0246ed
Packit Service 0246ed
  /*
Packit Service 0246ed
   * Wrap this in an additional Promise. The promise returned by
Packit Service 0246ed
   * cockpit.http.request() doesn't propagate exceptions thrown in a .catch
Packit Service 0246ed
   * handler. Thus, we need to reject() manually.
Packit Service 0246ed
   */
Packit Service 0246ed
  return new Promise((resolve, reject) => {
Packit Service 0246ed
    cockpitHttp
Packit Service 0246ed
      .request({
Packit Service 0246ed
        method: options.method,
Packit Service 0246ed
        path: options.path,
Packit Service 0246ed
        params: options.params,
Packit Service 0246ed
        headers: options.headers,
Packit Service 0246ed
        body: options.body,
Packit Service 0246ed
      })
Packit Service 0246ed
      .then((data) => {
Packit Service 0246ed
        if (replyFormat === "json") resolve(JSON.parse(data));
Packit Service 0246ed
        else if (replyFormat === "raw") resolve(data);
Packit Service 0246ed
        else throw new Error(`invalid replyFormat: '${replyFormat}'`);
Packit Service 0246ed
      })
Packit Service 0246ed
      .catch((error) =>
Packit Service 0246ed
        reject({
Packit Service 0246ed
          problem: error.problem,
Packit Service 0246ed
          message: error.message,
Packit Service 0246ed
          options,
Packit Service 0246ed
        })
Packit Service 0246ed
      );
Packit Service 0246ed
  });
Packit Service 0246ed
}
Packit Service 0246ed
Packit Service 0246ed
/*
Packit Service 0246ed
 * Send a GET request to the composer API.
Packit Service 0246ed
 */
Packit Service 0246ed
function get(path, options) {
Packit Service 0246ed
  return request({
Packit Service 0246ed
    body: "",
Packit Service 0246ed
    ...options,
Packit Service 0246ed
    path,
Packit Service 0246ed
  });
Packit Service 0246ed
}
Packit Service 0246ed
Packit Service 0246ed
/*
Packit Service 0246ed
 * Send a POST request to the composer API. `object` will be turned into a JSON
Packit Service 0246ed
 * payload.
Packit Service 0246ed
 */
Packit Service 0246ed
function post(path, object, options) {
Packit Service 0246ed
  return request({
Packit Service 0246ed
    ...options,
Packit Service 0246ed
    method: "POST",
Packit Service 0246ed
    path,
Packit Service 0246ed
    headers: { "Content-Type": "application/json" },
Packit Service 0246ed
    body: JSON.stringify(object),
Packit Service 0246ed
  });
Packit Service 0246ed
}
Packit Service 0246ed
Packit Service 0246ed
/*
Packit Service 0246ed
 * Send a DELETE request to the composer API.
Packit Service 0246ed
 */
Packit Service 0246ed
function _delete(path, options) {
Packit Service 0246ed
  return request({
Packit Service 0246ed
    ...options,
Packit Service 0246ed
    method: "DELETE",
Packit Service 0246ed
    path,
Packit Service 0246ed
    body: "",
Packit Service 0246ed
  });
Packit Service 0246ed
}
Packit Service 0246ed
Packit Service 0246ed
/*
Packit Service 0246ed
 * Wrappers for composer API calls
Packit Service 0246ed
 */
Packit Service 0246ed
Packit Service 0246ed
export function newBlueprint(blueprint) {
Packit Service 0246ed
  return post("/api/v0/blueprints/new", blueprint);
Packit Service 0246ed
}
Packit Service 0246ed
Packit Service 0246ed
export function depsolveBlueprint(blueprintName) {
Packit Service 0246ed
  return get(`/api/v0/blueprints/depsolve/${encodeURIComponent(blueprintName)}`);
Packit Service 0246ed
}
Packit Service 0246ed
Packit Service 0246ed
export function listModules(filter, selectedInputPage, pageSize) {
Packit Service 0246ed
  const page = selectedInputPage * pageSize;
Packit Service 0246ed
  return get(`/api/v0/modules/list/${encodeURIComponent(filter)}`, {
Packit Service 0246ed
    params: { limit: pageSize, offset: page },
Packit Service 0246ed
  });
Packit Service 0246ed
}
Packit Service 0246ed
Packit Service 0246ed
/*
Packit Service 0246ed
 * Next two functions have a different name from their API route, because the
Packit Service 0246ed
 * routes are confusing.
Packit Service 0246ed
 */
Packit Service 0246ed
export function getComponentInfo(componentNames) {
Packit Service 0246ed
  return get(`/api/v0/projects/info/${encodeURIComponent(componentNames)}`).then((response) => response.projects);
Packit Service 0246ed
}
Packit Service 0246ed
Packit Service 0246ed
export function getComponentDependencies(componentNames) {
Packit Service 0246ed
  return get(`/api/v0/modules/info/${encodeURIComponent(componentNames)}`).then((response) => response.modules);
Packit Service 0246ed
}
Packit Service 0246ed
Packit Service 0246ed
export function listBlueprints() {
Packit Service 0246ed
  return get("/api/v0/blueprints/list").then((response) => response.blueprints);
Packit Service 0246ed
}
Packit Service 0246ed
Packit Service 0246ed
export function getBlueprintInfo(blueprintName) {
Packit Service 0246ed
  return get(`/api/v0/blueprints/info/${encodeURIComponent(blueprintName)}`).then((blueprintdata) => {
Packit Service 0246ed
    if (blueprintdata.blueprints.length > 0) {
Packit Service 0246ed
      const blueprint = blueprintdata.blueprints[0];
Packit Service 0246ed
      blueprint.changed = blueprintdata.changes[0].changed;
Packit Service 0246ed
      blueprint.id = blueprintName;
Packit Service 0246ed
      return blueprint;
Packit Service 0246ed
    }
Packit Service 0246ed
  });
Packit Service 0246ed
}
Packit Service 0246ed
Packit Service 0246ed
export function getComposeTypes() {
Packit Service 0246ed
  const imageTypeLabels = {
Packit Service 0246ed
    ami: "Amazon Machine Image Disk (.ami)",
Packit Service 0246ed
    "ext4-filesystem": "Ext4 File System Image (.img)",
Packit Service 0246ed
    "fedora-iot-commit": "Fedora IoT Commit (.tar)",
Packit Service 0246ed
    "live-iso": "Live Bootable ISO (.iso)",
Packit Service 0246ed
    "partitioned-disk": "Raw Partitioned Disk Image (.img)",
Packit Service 0246ed
    qcow2: "QEMU QCOW2 Image (.qcow2)",
Packit Service 0246ed
    openstack: "OpenStack (.qcow2)",
Packit Service 0246ed
    "rhel-edge-commit": "RHEL for Edge Commit (.tar)",
Packit Service 0246ed
    tar: "TAR Archive (.tar)",
Packit Service 0246ed
    vhd: "Azure Disk Image (.vhd)",
Packit Service 0246ed
    vmdk: "VMware Virtual Machine Disk (.vmdk)",
Packit Service 0246ed
    alibaba: "Alibaba Machine Image (.qcow2)",
Packit Service 0246ed
    google: "Google Compute Engine Image (.tar.gz)",
Packit Service 0246ed
    "hyper-v": "Hyper-V Virtual Machine Disk (.vhdx)",
Packit Service 0246ed
  };
Packit Service 0246ed
  const imageTypes = get("/api/v0/compose/types").then((data) =>
Packit Service 0246ed
    data.types.map((type) => {
Packit Service 0246ed
      return { ...type, label: imageTypeLabels[type.name] || type.name };
Packit Service 0246ed
    })
Packit Service 0246ed
  );
Packit Service 0246ed
  return imageTypes;
Packit Service 0246ed
}
Packit Service 0246ed
Packit Service 0246ed
export function deleteBlueprint(blueprint) {
Packit Service 0246ed
  return _delete(`/api/v0/blueprints/delete/${encodeURIComponent(blueprint)}`).then(() => blueprint);
Packit Service 0246ed
}
Packit Service 0246ed
Packit Service 0246ed
export function deleteWorkspace(blueprintId) {
Packit Service 0246ed
  return _delete(`/api/v0/blueprints/workspace/${encodeURIComponent(blueprintId)}`);
Packit Service 0246ed
}
Packit Service 0246ed
Packit Service 0246ed
export function commitToWorkspace(blueprint) {
Packit Service 0246ed
  return post("/api/v0/blueprints/workspace", blueprint);
Packit Service 0246ed
}
Packit Service 0246ed
Packit Service 0246ed
export function diffBlueprintToWorkspace(blueprintId) {
Packit Service 0246ed
  return get(`/api/v0/blueprints/diff/${encodeURIComponent(blueprintId)}/NEWEST/WORKSPACE`);
Packit Service 0246ed
}
Packit Service 0246ed
Packit Service 0246ed
export function getSourceInfo(sourceName) {
Packit Service 0246ed
  return get(`/api/v0/projects/source/info/${encodeURIComponent(sourceName)}`);
Packit Service 0246ed
}
Packit Service 0246ed
Packit Service 0246ed
export function newSource(source) {
Packit Service 0246ed
  return post("/api/v0/projects/source/new", source);
Packit Service 0246ed
}
Packit Service 0246ed
Packit Service 0246ed
export function deleteSource(sourceName) {
Packit Service 0246ed
  return _delete(`/api/v0/projects/source/delete/${encodeURIComponent(sourceName)}`);
Packit Service 0246ed
}
Packit Service 0246ed
Packit Service 0246ed
export function startCompose(blueprintName, composeType, imageSize, ostree, uploadSettings) {
Packit Service 0246ed
  return post("/api/v1/compose", {
Packit Service 0246ed
    blueprint_name: blueprintName,
Packit Service 0246ed
    compose_type: composeType,
Packit Service 0246ed
    size: imageSize,
Packit Service 0246ed
    ostree,
Packit Service 0246ed
    upload: uploadSettings,
Packit Service 0246ed
    branch: "master",
Packit Service 0246ed
  });
Packit Service 0246ed
}
Packit Service 0246ed
Packit Service 0246ed
export function cancelCompose(compose) {
Packit Service 0246ed
  return _delete(`/api/v1/compose/cancel/${encodeURIComponent(compose)}`);
Packit Service 0246ed
}
Packit Service 0246ed
Packit Service 0246ed
export function deleteCompose(compose) {
Packit Service 0246ed
  return _delete(`/api/v1/compose/delete/${encodeURIComponent(compose)}`);
Packit Service 0246ed
}
Packit Service 0246ed
Packit Service 0246ed
export function getComposeStatus(uuid) {
Packit Service 0246ed
  return get(`/api/v1/compose/status/${encodeURIComponent(uuid)}`);
Packit Service 0246ed
}
Packit Service 0246ed
Packit Service 0246ed
export function getQueuedComposes() {
Packit Service 0246ed
  return get("/api/v1/compose/queue").then((data) => data.new.concat(data.run));
Packit Service 0246ed
}
Packit Service 0246ed
Packit Service 0246ed
export function getFinishedComposes() {
Packit Service 0246ed
  return get("/api/v1/compose/finished").then((data) => data.finished);
Packit Service 0246ed
}
Packit Service 0246ed
Packit Service 0246ed
export function getFailedComposes() {
Packit Service 0246ed
  return get("/api/v1/compose/failed").then((data) => data.failed);
Packit Service 0246ed
}
Packit Service 0246ed
Packit Service 0246ed
export function getComposeLog(uuid) {
Packit Service 0246ed
  return get(`/api/v1/compose/log/${encodeURIComponent(uuid)}`, { replyFormat: "raw" });
Packit Service 0246ed
}
Packit Service 0246ed
Packit Service 0246ed
export function getUploadProviders() {
Packit Service 0246ed
  return providerSettings;
Packit Service 0246ed
}