Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package cockpit-d-installer for 
openSUSE:Factory checked in at 2022-12-23 10:21:24
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/cockpit-d-installer (Old)
 and      /work/SRC/openSUSE:Factory/.cockpit-d-installer.new.1563 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "cockpit-d-installer"

Fri Dec 23 10:21:24 2022 rev:2 rq:1044289 version:0

Changes:
--------
--- /work/SRC/openSUSE:Factory/cockpit-d-installer/cockpit-d-installer.changes  
2022-12-07 17:37:19.245313066 +0100
+++ 
/work/SRC/openSUSE:Factory/.cockpit-d-installer.new.1563/cockpit-d-installer.changes
        2022-12-23 10:21:25.539454303 +0100
@@ -1,0 +2,14 @@
+Thu Dec 15 10:14:22 UTC 2022 - Knut Anderssen <[email protected]>
+
+- Do not show the link to configure wifi networks when wireless is
+  not enabled (gh#yast/d-installer#323).
+- Version 0.6.2
+
+-------------------------------------------------------------------
+Thu Dec 15 08:55:02 UTC 2022 - Imobach Gonzalez Sosa <[email protected]>
+
+- Display questions during the software installation (related to
+  gh#yast/d-installer#369).
+- Update to version 0.6.1
+
+-------------------------------------------------------------------

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ cockpit-d-installer.spec ++++++
--- /var/tmp/diff_new_pack.dPk0D6/_old  2022-12-23 10:21:37.803524392 +0100
+++ /var/tmp/diff_new_pack.dPk0D6/_new  2022-12-23 10:21:37.807524414 +0100
@@ -1,5 +1,5 @@
 #
-# spec file for package cockpit-machines
+# spec file for package cockpit-d-installer
 #
 # Copyright (c) 2022 SUSE LLC
 #
@@ -31,10 +31,10 @@
 %include %_sourcedir/node_modules.spec.inc
 BuildArch:      noarch
 Requires:       cockpit
+BuildRequires:  appstream-glib
 BuildRequires:  cockpit
 BuildRequires:  cockpit-devel >= 243
 BuildRequires:  local-npm-registry
-BuildRequires:  appstream-glib
 
 %description
 Cockpit module for the experimental YaST D-Installer.

++++++ d-installer.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/d-installer/package/_service 
new/d-installer/package/_service
--- old/d-installer/package/_service    2022-12-05 16:55:34.000000000 +0100
+++ new/d-installer/package/_service    2022-12-15 15:26:34.000000000 +0100
@@ -5,6 +5,7 @@
     <param name="scm">git</param>
     <param name="revision">master</param>
     <param name="subdir">web</param>
+    <param name="without-version">enable</param>
     <param name="extract">package-lock.json</param>
     <param name="extract">package/cockpit-d-installer.changes</param>
     <param name="extract">package/cockpit-d-installer.spec</param>
@@ -16,6 +17,7 @@
   </service>
   <service mode="buildtime" name="tar">
     <param name="obsinfo">d-installer.obsinfo</param>
+    <param name="filename">d-installer</param>
   </service>
   <service mode="buildtime" name="set_version">
     <param name="basename">d-installer</param>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/d-installer/package/cockpit-d-installer.changes 
new/d-installer/package/cockpit-d-installer.changes
--- old/d-installer/package/cockpit-d-installer.changes 2022-12-05 
16:55:34.000000000 +0100
+++ new/d-installer/package/cockpit-d-installer.changes 2022-12-15 
15:26:34.000000000 +0100
@@ -1,4 +1,18 @@
 -------------------------------------------------------------------
+Thu Dec 15 10:14:22 UTC 2022 - Knut Anderssen <[email protected]>
+
+- Do not show the link to configure wifi networks when wireless is
+  not enabled (gh#yast/d-installer#323).
+- Version 0.6.2
+
+-------------------------------------------------------------------
+Thu Dec 15 08:55:02 UTC 2022 - Imobach Gonzalez Sosa <[email protected]>
+
+- Display questions during the software installation (related to
+  gh#yast/d-installer#369).
+- Update to version 0.6.1
+
+-------------------------------------------------------------------
 Mon Dec  5 13:18:37 UTC 2022 - Imobach Gonzalez Sosa <[email protected]>
 
 - Update to version 0.6.0
@@ -10,18 +24,18 @@
   (related to gh#yast/d-installer#297)
 
 -------------------------------------------------------------------
-Fri Dec 2 10:48:14 UTC 2022 - Josef Reidinger <[email protected]>
-
-- Add support for adapting the configuration depending on the
-  architecture (gh#yast/d-installer#339)
-
--------------------------------------------------------------------
 Fri Dec  2 13:41:41 UTC 2022 - José Iván López González <[email protected]>
 
 - Add new UI for storage proposal offering LVM and encyption
   options (gh#yast/d-installer#321).
 
 -------------------------------------------------------------------
+Fri Dec 2 10:48:14 UTC 2022 - Josef Reidinger <[email protected]>
+
+- Add support for adapting the configuration depending on the
+  architecture (gh#yast/d-installer#339)
+
+-------------------------------------------------------------------
 Wed Nov 30 08:16:42 UTC 2022 - Knut Alejandro Anderssen González 
<[email protected]>
 
 - Add validation for the first user creation (gh#yast/d-installer#337)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/d-installer/package/cockpit-d-installer.spec 
new/d-installer/package/cockpit-d-installer.spec
--- old/d-installer/package/cockpit-d-installer.spec    2022-12-05 
16:55:34.000000000 +0100
+++ new/d-installer/package/cockpit-d-installer.spec    2022-12-15 
15:26:34.000000000 +0100
@@ -24,7 +24,7 @@
 URL:            https://github.com/yast/d-installer
 # source_validator insists that if obscpio has no version then
 # tarball must neither
-Source0:        d-installer-%{version}.tar
+Source0:        d-installer.tar
 Source10:       package-lock.json
 Source11:       node_modules.spec.inc
 Source12:       node_modules.sums
@@ -40,7 +40,7 @@
 Cockpit module for the experimental YaST D-Installer.
 
 %prep
-%autosetup -p1 -n d-installer-%{version}
+%autosetup -p1 -n d-installer
 rm -f package-lock.json
 local-npm-registry %{_sourcedir} install --with=dev --legacy-peer-deps || ( 
find ~/.npm/_logs -name '*-debug.log' -print0 | xargs -0 cat; false)
 
@@ -50,6 +50,8 @@
 
 %install
 %make_install
+
+%check
 appstream-util validate-relax --nonet %{buildroot}/%{_datadir}/metainfo/*
 
 %files
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/d-installer/src/client/network/index.js 
new/d-installer/src/client/network/index.js
--- old/d-installer/src/client/network/index.js 2022-12-05 16:55:34.000000000 
+0100
+++ new/d-installer/src/client/network/index.js 2022-12-15 15:26:34.000000000 
+0100
@@ -25,6 +25,7 @@
 import { ConnectionTypes, ConnectionState } from "./model";
 
 /**
+ * @typedef {import("./model").NetworkSettings} NetworkSettings
  * @typedef {import("./model").Connection} Connection
  * @typedef {import("./model").ActiveConnection} ActiveConnection
  * @typedef {import("./model").IPAddress} IPAddress
@@ -37,7 +38,8 @@
   ACTIVE_CONNECTION_REMOVED: "active_connection_removed",
   CONNECTION_ADDED: "connection_added",
   CONNECTION_UPDATED: "connection_updated",
-  CONNECTION_REMOVED: "connection_removed"
+  CONNECTION_REMOVED: "connection_removed",
+  SETTINGS_UPDATED: "settings_updated"
 });
 
 /**
@@ -52,7 +54,7 @@
  * @property {(connection: Connection) => Promise<any>} addConnection
  * @property {(connection: Connection) => Promise<any>} updateConnection
  * @property {(connection: Connection) => void} deleteConnection
- * @property {() => string} hostname
+ * @property {() => NetworkSettings} settings
  * @property {() => void} setUp
  */
 
@@ -210,13 +212,11 @@
     return conns.flatMap(c => c.addresses);
   }
 
-  /**
-   * Returns the computer's hostname
-   *
-   * @return {string}
-   */
-  hostname() {
-    return this.adapter.hostname();
+  /*
+  * Returns network general settings
+  */
+  settings() {
+    return this.adapter.settings();
   }
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/d-installer/src/client/network/model.js 
new/d-installer/src/client/network/model.js
--- old/d-installer/src/client/network/model.js 2022-12-05 16:55:34.000000000 
+0100
+++ new/d-installer/src/client/network/model.js 2022-12-15 15:26:34.000000000 
+0100
@@ -108,6 +108,11 @@
  */
 
 /**
+* @typedef {object} NetworkSettings
+* @property {boolean} wireless
+* @property {string} hostname
+
+/**
  * Returns an IPv4 configuration object
  *
  * Defaults values can be overriden
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/d-installer/src/client/network/network_manager.js 
new/d-installer/src/client/network/network_manager.js
--- old/d-installer/src/client/network/network_manager.js       2022-12-05 
16:55:34.000000000 +0100
+++ new/d-installer/src/client/network/network_manager.js       2022-12-15 
15:26:34.000000000 +0100
@@ -28,6 +28,7 @@
 import { createAccessPoint, createConnection, SecurityProtocols } from 
"./model";
 
 /**
+ * @typedef {import("./model").NetworkSettings} NetworkSettings
  * @typedef {import("./model").Connection} Connection
  * @typedef {import("./model").ActiveConnection} ActiveConnection
  * @typedef {import("./model").IPAddress} IPAddress
@@ -177,6 +178,7 @@
       accessPoints: {},
       activeConnections: {},
       ip4Configs: {},
+      manager: null,
       settings: null,
       connections: {}
     };
@@ -196,6 +198,7 @@
         ACTIVE_CONNECTION_IFACE, ACTIVE_CONNECTION_NAMESPACE
       ),
       ip4Configs: await this.client.proxies(IP4CONFIG_IFACE, 
IP4CONFIG_NAMESPACE),
+      manager: await this.client.proxy(IFACE),
       settings: await this.client.proxy(SETTINGS_IFACE),
       connections: await this.client.proxies(CONNECTION_IFACE, 
SETTINGS_NAMESPACE)
     };
@@ -372,6 +375,8 @@
   async subscribeToEvents() {
     const activeConnectionProxies = this.proxies.activeConnections;
     const connectionProxies = this.proxies.connections;
+    const managerProxy = this.proxies.manager;
+    const settingsProxy = this.proxies.settings;
 
     /** @type {(eventType: string) => NetworkEventFn} */
     const handleWrapperActiveConnection = (eventType) => (_event, proxy) => {
@@ -392,6 +397,12 @@
       this.eventsHandler({ type: eventType, payload: connection });
     };
 
+    const handleWrapperSettings = (eventType) => () => {
+      const settings = this.settingsFromProxies(managerProxy, settingsProxy);
+
+      this.eventsHandler({ type: eventType, payload: settings });
+    };
+
     // FIXME: do not build a map (eventTypesMap), just inject the type here
     connectionProxies.addEventListener("added", 
handleWrapperConnection(NetworkEventTypes.CONNECTION_ADDED));
     connectionProxies.addEventListener("changed", 
handleWrapperConnection(NetworkEventTypes.CONNECTION_UPDATED));
@@ -401,6 +412,9 @@
     activeConnectionProxies.addEventListener("added", 
handleWrapperActiveConnection(NetworkEventTypes.ACTIVE_CONNECTION_ADDED));
     activeConnectionProxies.addEventListener("changed", 
handleWrapperActiveConnection(NetworkEventTypes.ACTIVE_CONNECTION_UPDATED));
     activeConnectionProxies.addEventListener("removed", 
handleWrapperActiveConnection(NetworkEventTypes.ACTIVE_CONNECTION_REMOVED));
+
+    managerProxy.addEventListener("changed", 
handleWrapperSettings(NetworkEventTypes.SETTINGS_UPDATED));
+    settingsProxy.addEventListener("changed", 
handleWrapperSettings(NetworkEventTypes.SETTINGS_UPDATED));
   }
 
   /**
@@ -486,17 +500,19 @@
     return { address: data.address.v, prefix: parseInt(data.prefix.v) };
   }
 
-  /**
-   * Returns the computer's hostname
-   *
-   * @return {string}
-   *
-   * 
https://developer-old.gnome.org/NetworkManager/stable/gdbus-org.freedesktop.NetworkManager.Settings.html
-   */
-  hostname() {
-    if (!this.proxies.settings) return "";
+  settingsFromProxies(manager, settings) {
+    return {
+      wireless: !!(manager?.WirelessEnabled && 
manager?.WirelessHardwareEnabled),
+      hostname: settings?.Hostname || ""
+    };
+  }
 
-    return this.proxies.settings.Hostname;
+  /*
+  * Returns NetworkManager general settings
+  * @return {NetworkSettings}
+  */
+  settings() {
+    return this.settingsFromProxies(this.proxies.manager, 
this.proxies.settings);
   }
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/d-installer/src/client/network/network_manager.test.js 
new/d-installer/src/client/network/network_manager.test.js
--- old/d-installer/src/client/network/network_manager.test.js  2022-12-05 
16:55:34.000000000 +0100
+++ new/d-installer/src/client/network/network_manager.test.js  2022-12-15 
15:26:34.000000000 +0100
@@ -95,12 +95,15 @@
   }
 };
 
+// Reminder: by default, properties added using Object.defineProperties() are 
not enumerable.
+// We use #defineProperties here, so it doesn't show up as a "connection" in 
these objects.
+// 
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperties#enumerable
 Object.defineProperties(activeConnections, {
-  addEventListener: { value: jest.fn(), enumerable: false }
+  addEventListener: { value: jest.fn() }
 });
 
 Object.defineProperties(connections, {
-  addEventListener: { value: jest.fn(), enumerable: false }
+  addEventListener: { value: jest.fn() }
 });
 
 const addressesData = {
@@ -125,18 +128,26 @@
 };
 
 const ActivateConnectionFn = jest.fn();
-const networkProxy = () => ({
+
+const networkProxy = {
   wait: jest.fn(),
   ActivateConnection: ActivateConnectionFn,
   ActiveConnections: Object.keys(activeConnections),
-});
+  WirelessEnabled: false,
+  WifiHardwareEnabled: true
+};
 
 const AddConnectionFn = jest.fn();
-const networkSettingsProxy = () => ({
+const networkSettingsProxy = {
   wait: jest.fn(),
   Hostname: "testing-machine",
   GetConnectionByUuid: () => "/org/freedesktop/NetworkManager/Settings/1",
-  AddConnection: AddConnectionFn
+  AddConnection: AddConnectionFn,
+  addEventListener: () => ({ value: jest.fn(), enumerable: false })
+};
+
+Object.defineProperties(networkProxy, {
+  addEventListener: { value: jest.fn(), enumerable: false }
 });
 
 const connectionSettingsMock = {
@@ -172,8 +183,8 @@
 describe("NetworkManagerAdapter", () => {
   beforeEach(() => {
     dbusClient.proxy = jest.fn().mockImplementation(iface => {
-      if (iface === NM_IFACE) return networkProxy();
-      if (iface === NM_SETTINGS_IFACE) return networkSettingsProxy();
+      if (iface === NM_IFACE) return networkProxy;
+      if (iface === NM_SETTINGS_IFACE) return networkSettingsProxy;
       if (iface === NM_CONNECTION_IFACE) return connectionSettingsProxy();
     });
 
@@ -345,11 +356,12 @@
     });
   });
 
-  describe("#hostname", () => {
+  describe("#settings", () => {
     it("returns the Network Manager settings hostname", async() => {
       const client = new NetworkManagerAdapter(dbusClient);
       await client.setUp();
-      expect(client.hostname()).toEqual("testing-machine");
+      expect(client.settings().hostname).toEqual("testing-machine");
+      expect(client.settings().wireless).toEqual(false);
     });
   });
 });
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/d-installer/src/client/network.test.js 
new/d-installer/src/client/network.test.js
--- old/d-installer/src/client/network.test.js  2022-12-05 16:55:34.000000000 
+0100
+++ new/d-installer/src/client/network.test.js  2022-12-15 15:26:34.000000000 
+0100
@@ -38,11 +38,15 @@
   addresses: [{ address: "192.168.122.1", prefix: 24 }]
 };
 
+const settings = {
+  wireless: true,
+  hostname: "localhost.localdomain"
+};
+
 const adapter = {
   setUp: jest.fn(),
   activeConnections: jest.fn().mockReturnValue([active_conn]),
   connections: jest.fn().mockReturnValue([conn]),
-  hostname: jest.fn().mockReturnValue("localhost.localdomain"),
   subscribe: jest.fn(),
   getConnection: jest.fn(),
   addConnection: jest.fn(),
@@ -50,7 +54,8 @@
   deleteConnection: jest.fn(),
   accessPoints: jest.fn(),
   connectTo: jest.fn(),
-  addAndConnectTo: jest.fn()
+  addAndConnectTo: jest.fn(),
+  settings: jest.fn().mockReturnValue(settings),
 };
 
 describe("NetworkClient", () => {
@@ -69,10 +74,11 @@
     });
   });
 
-  describe("#hostname", () => {
-    it("returns the hostname from the adapter", () => {
+  describe("#settings", () => {
+    it("returns network general settings", () => {
       const client = new NetworkClient(adapter);
-      expect(client.hostname()).toEqual("localhost.localdomain");
+      expect(client.settings().hostname).toEqual("localhost.localdomain");
+      expect(client.settings().wireless).toEqual(true);
     });
   });
 });
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/d-installer/src/client/storage.js 
new/d-installer/src/client/storage.js
--- old/d-installer/src/client/storage.js       2022-12-05 16:55:34.000000000 
+0100
+++ new/d-installer/src/client/storage.js       2022-12-15 15:26:34.000000000 
+0100
@@ -95,8 +95,6 @@
   /**
    * Calculates a new proposal
    *
-   * @todo Do not send undefined values
-   *
    * @param {object} settings - proposal settings
    * @param {?string[]} [settings.candidateDevices] - Devices to use for the 
proposal
    * @param {?string} [settings.encryptionPassword] - Password for encrypting 
devices
@@ -107,24 +105,47 @@
   async calculateProposal({ candidateDevices, encryptionPassword, lvm, volumes 
}) {
     const proxy = await this.client.proxy(STORAGE_PROPOSAL_IFACE);
 
-    const dbusVolume = volume => {
-      return {
-        MountPoint: cockpit.variant("s", volume.mountPoint),
-        Encrypted: cockpit.variant("b", volume.encrypted),
-        FsType: cockpit.variant("s", volume.fsType),
-        MinSize: cockpit.variant("x", volume.minSize),
-        MaxSize: cockpit.variant("x", volume.maxSize),
-        FixedSizeLimits: cockpit.variant("b", volume.fixedSizeLimits),
-        Snapshots: cockpit.variant("b", volume.snapshots)
-      };
+    // Builds a new object without undefined attributes
+    const cleanObject = (object) => {
+      const newObject = { ...object };
+
+      Object.keys(newObject).forEach(key => newObject[key] === undefined && 
delete newObject[key]);
+      return newObject;
+    };
+
+    // Builds the cockpit object or returns undefined if there is no value
+    const cockpitValue = (type, value) => {
+      if (value === undefined) return undefined;
+
+      return cockpit.variant(type, value);
     };
 
-    return proxy.Calculate({
-      CandidateDevices: cockpit.variant("as", candidateDevices),
-      EncryptionPassword: cockpit.variant("s", encryptionPassword),
-      LVM: cockpit.variant("b", lvm),
-      Volumes: cockpit.variant("aa{sv}", volumes.map(dbusVolume))
+    const dbusVolume = (volume) => {
+      return cleanObject({
+        MountPoint: cockpitValue("s", volume.mountPoint),
+        Encrypted: cockpitValue("b", volume.encrypted),
+        FsType: cockpitValue("s", volume.fsType),
+        MinSize: cockpitValue("x", volume.minSize),
+        MaxSize: cockpitValue("x", volume.maxSize),
+        FixedSizeLimits: cockpitValue("b", volume.fixedSizeLimits),
+        Snapshots: cockpitValue("b", volume.snapshots)
+      });
+    };
+
+    const dbusVolumes = (volumes) => {
+      if (!volumes) return undefined;
+
+      return volumes.map(dbusVolume);
+    };
+
+    const settings = cleanObject({
+      CandidateDevices: cockpitValue("as", candidateDevices),
+      EncryptionPassword: cockpitValue("s", encryptionPassword),
+      LVM: cockpitValue("b", lvm),
+      Volumes: cockpitValue("aa{sv}", dbusVolumes(volumes))
     });
+
+    return proxy.Calculate(settings);
   }
 
   /**
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/d-installer/src/client/storage.test.js 
new/d-installer/src/client/storage.test.js
--- old/d-installer/src/client/storage.test.js  2022-12-05 16:55:34.000000000 
+0100
+++ new/d-installer/src/client/storage.test.js  2022-12-15 15:26:34.000000000 
+0100
@@ -25,6 +25,8 @@
 // NOTE: should we export them?
 const STORAGE_PROPOSAL_IFACE = "org.opensuse.DInstaller.Storage.Proposal1";
 
+const calculateFn = jest.fn();
+
 const dbusClient = new DBusClient("");
 const storageProposalProxy = {
   wait: jest.fn(),
@@ -35,8 +37,25 @@
   CandidateDevices: ["/dev/sda"],
   LVM: true,
   Volumes: [
-    { MountPoint: { t: "s", v: "/test1" } },
-    { MountPoint: { t: "s", v: "/test2" } }
+    {
+      MountPoint: { t: "s", v: "/test1" },
+      Optional: { t: "b", v: true },
+      DeviceType: { t: "s", v: "partition" },
+      Encrypted: { t: "b", v: false },
+      FsTypes: { t: "as", v: [{ t: "s" , v: "Btrfs"} , { t: "s", v: "Ext3"}] },
+      FsType: { t: "s", v: "Btrfs" },
+      MinSize: { t: "x", v: 1024 },
+      MaxSize: { t: "x", v: 2048 },
+      FixedSizeLimits: { t: "b", v: false },
+      AdaptiveSizes: { t: "b", v: false },
+      Snapshots: { t: "b", v: true },
+      SnapshotsConfigurable: { t: "b", v: true },
+      SnapshotsAffectSizes: { t: "b", v: false },
+      SizeRelevantVolumes: { t: "as", v: [] }
+    },
+    {
+      MountPoint: { t: "s", v: "/test2" }
+    }
   ],
   Actions: [
     {
@@ -44,7 +63,8 @@
       Subvol: { t: "b", v: false },
       Delete: { t: "b", v: false }
     }
-  ]
+  ],
+  Calculate: calculateFn
 };
 
 beforeEach(() => {
@@ -67,7 +87,76 @@
       { text: "Mount /dev/sdb1 as root", subvol: false, delete: false }
     ]);
 
-    expect(proposal.volumes[0].mountPoint).toEqual("/test1");
+    expect(proposal.volumes[0]).toEqual({
+      mountPoint: "/test1",
+      optional: true,
+      deviceType: "partition",
+      encrypted: false,
+      fsTypes: ["Btrfs", "Ext3"],
+      fsType: "Btrfs",
+      minSize: 1024,
+      maxSize:2048,
+      fixedSizeLimits: false,
+      adaptiveSizes: false,
+      snapshots: true,
+      snapshotsConfigurable: true,
+      snapshotsAffectSizes: false,
+      sizeRelevantVolumes: []
+    });
     expect(proposal.volumes[1].mountPoint).toEqual("/test2");
   });
 });
+
+describe("#calculate", () => {
+  it("calculates a default proposal when no settings are given", async () => {
+    const client = new StorageClient(dbusClient);
+    await client.calculateProposal({});
+
+    expect(calculateFn).toHaveBeenCalledWith({});
+  });
+
+  it("calculates a proposal with the given settings", async () => {
+    const client = new StorageClient(dbusClient);
+    await client.calculateProposal({
+      candidateDevices: ["/dev/vda"],
+      encryptionPassword: "12345",
+      lvm: true,
+      volumes: [
+        {
+          mountPoint: "/test1",
+          encrypted: false,
+          fsType: "Btrfs",
+          minSize: 1024,
+          maxSize:2048,
+          fixedSizeLimits: false,
+          snapshots: true
+        },
+        {
+          mountPoint: "/test2",
+          minSize: 1024
+        }
+      ]
+    });
+
+    expect(calculateFn).toHaveBeenCalledWith({
+      CandidateDevices: { t: "as", v: ["/dev/vda"] },
+      EncryptionPassword: { t: "s", v: "12345" },
+      LVM: { t: "b", v: true },
+      Volumes: { t: "aa{sv}", v: [
+        {
+          MountPoint: { t: "s", v: "/test1" },
+          Encrypted: { t: "b", v: false },
+          FsType: { t: "s", v: "Btrfs" },
+          MinSize: { t: "x", v: 1024 },
+          MaxSize: { t: "x", v: 2048 },
+          FixedSizeLimits: { t: "b", v: false },
+          Snapshots: { t: "b", v: true }
+        },
+        {
+          MountPoint: { t: "s", v: "/test2"  },
+          MinSize: { t: "x", v: 1024 }
+        }
+      ]}
+    });
+  });
+});
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/d-installer/src/components/core/InstallationProgress.jsx 
new/d-installer/src/components/core/InstallationProgress.jsx
--- old/d-installer/src/components/core/InstallationProgress.jsx        
2022-12-05 16:55:34.000000000 +0100
+++ new/d-installer/src/components/core/InstallationProgress.jsx        
2022-12-15 15:26:34.000000000 +0100
@@ -23,6 +23,7 @@
 
 import ProgressReport from "./ProgressReport";
 import { Center, Title, PageIcon } from "@components/layout";
+import { Questions } from "@components/questions";
 
 import { EOS_DOWNLOADING as Icon } from "eos-icons-react";
 
@@ -32,6 +33,7 @@
       <Title>Installing</Title>
       <PageIcon><Icon /></PageIcon>
       <Center><ProgressReport /></Center>
+      <Questions />
     </>
   );
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/d-installer/src/components/network/Network.jsx 
new/d-installer/src/components/network/Network.jsx
--- old/d-installer/src/components/network/Network.jsx  2022-12-05 
16:55:34.000000000 +0100
+++ new/d-installer/src/components/network/Network.jsx  2022-12-15 
15:26:34.000000000 +0100
@@ -31,10 +31,12 @@
   const [initialized, setInitialized] = useState(false);
   const [connections, setConnections] = useState([]);
   const [wifiSelectorOpen, setWifiSelectorOpen] = useState(false);
+  const [wireless, setWireless] = useState(false);
 
   useEffect(() => {
     if (!initialized) return;
 
+    setWireless(client.network.settings().wireless);
     setConnections(client.network.activeConnections());
   }, [client.network, initialized]);
 
@@ -59,6 +61,11 @@
 
         case NetworkEventTypes.ACTIVE_CONNECTION_REMOVED: {
           setConnections(conns => conns.filter(c => c.id !== payload.id));
+          break;
+        }
+
+        case NetworkEventTypes.SETTINGS_UPDATED: {
+          setWireless(payload.wireless);
         }
       }
     });
@@ -81,10 +88,11 @@
       <StackItem>
         <NetworkWifiStatus connections={activeWifiConnections} />
       </StackItem>
-      <StackItem>
-        <Button variant="link" onClick={() => 
setWifiSelectorOpen(true)}>Connect to a Wi-Fi network</Button>
-        <WifiSelector isOpen={wifiSelectorOpen} onClose={() => 
setWifiSelectorOpen(false)} />
-      </StackItem>
+      { wireless &&
+        <StackItem>
+          <Button variant="link" onClick={() => 
setWifiSelectorOpen(true)}>Connect to a Wi-Fi network</Button>
+          <WifiSelector isOpen={wifiSelectorOpen} onClose={() => 
setWifiSelectorOpen(false)} />
+        </StackItem> }
     </Stack>
   );
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/d-installer/src/components/network/Network.test.jsx 
new/d-installer/src/components/network/Network.test.jsx
--- old/d-installer/src/components/network/Network.test.jsx     2022-12-05 
16:55:34.000000000 +0100
+++ new/d-installer/src/components/network/Network.test.jsx     2022-12-15 
15:26:34.000000000 +0100
@@ -20,7 +20,7 @@
  */
 
 import React from "react";
-import { screen, within } from "@testing-library/react";
+import { screen, within, waitFor } from "@testing-library/react";
 import { installerRender } from "@/test-utils";
 import Network from "@components/network/Network";
 import { createClient } from "@client";
@@ -29,6 +29,9 @@
 jest.mock("@components/network/NetworkWiredStatus", () => () => "Wired 
Connections");
 jest.mock("@components/network/NetworkWifiStatus", () => () => "WiFi 
Connections");
 
+const networkSettings = { wireless: false, hostname: "test" };
+let settingsFn = jest.fn().mockReturnValue(networkSettings);
+
 beforeEach(() => {
   createClient.mockImplementation(() => {
     return {
@@ -37,32 +40,55 @@
         activeConnections: () => [],
         connections: () => Promise.resolve([]),
         accessPoints: () => [],
-        onNetworkEvent: jest.fn()
+        onNetworkEvent: jest.fn(),
+        settings: settingsFn
       }
     };
   });
 });
 
 describe("Network", () => {
-  it("shows a link to open the WiFi selector", async () => {
-    installerRender(<Network />);
-    await screen.findByRole("button", { name: "Connect to a Wi-Fi network" });
+  describe("when it has not been initialized", () => {
+    it("renders nothing", async () => {
+      const { container } = installerRender(<Network />, { usingLayout: false 
});
+      await waitFor(() => expect(container).toBeEmptyDOMElement());
+    });
   });
 
-  it("renders a summary for wired and wifi connections", async () => {
-    installerRender(<Network />);
+  describe("when it has been initialized", () => {
+    it("renders a summary for wired and wifi connections", async () => {
+      installerRender(<Network />);
 
-    await screen.findByText("Wired Connections");
-    await screen.findByText("WiFi Connections");
-  });
+      await screen.findByText("Wired Connections");
+      await screen.findByText("WiFi Connections");
+    });
+
+    describe("when Wireless is currently not enabled", () => {
+      it("does not show a link to open the WiFi selector", async () => {
+        installerRender(<Network />, { usingLayout: false });
+        await waitFor(() => expect(screen.queryByRole("button", { name: 
"Connect to a Wi-Fi network" })).not.toBeInTheDocument());
+      });
+    });
 
-  describe("when the user clicks on connect to a Wi-Fi", () => {
-    it("opens the WiFi selector dialog", async () => {
-      const { user } = installerRender(<Network />);
-      const link = await screen.findByRole("button", { name: "Connect to a 
Wi-Fi network" });
-      await user.click(link);
-      const wifiDialog = await screen.findByRole("dialog");
-      within(wifiDialog).getByText("Connect to a Wi-Fi network");
+    describe("when Wireless is currently enabled", () => {
+      beforeEach(() => {
+        settingsFn = jest.fn().mockReturnValue({ ...networkSettings, wireless: 
true });
+      });
+
+      it("shows a link to open the WiFi selector", async () => {
+        installerRender(<Network />);
+        await screen.findByRole("button", { name: "Connect to a Wi-Fi network" 
});
+      });
+
+      describe("when the user clicks on connect to a Wi-Fi", () => {
+        it("opens the WiFi selector dialog", async () => {
+          const { user } = installerRender(<Network />);
+          const link = await screen.findByRole("button", { name: "Connect to a 
Wi-Fi network" });
+          await user.click(link);
+          const wifiDialog = await screen.findByRole("dialog");
+          within(wifiDialog).getByText("Connect to a Wi-Fi network");
+        });
+      });
     });
   });
 });
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/d-installer/src/components/network/TargetIpsPopup.jsx 
new/d-installer/src/components/network/TargetIpsPopup.jsx
--- old/d-installer/src/components/network/TargetIpsPopup.jsx   2022-12-05 
16:55:34.000000000 +0100
+++ new/d-installer/src/components/network/TargetIpsPopup.jsx   2022-12-15 
15:26:34.000000000 +0100
@@ -45,7 +45,7 @@
 
     const refreshState = () => {
       setAddresses(client.network.addresses());
-      setHostname(client.network.hostname());
+      setHostname(client.network.settings().hostname);
     };
 
     refreshState();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/d-installer/src/components/network/TargetIpsPopup.test.jsx 
new/d-installer/src/components/network/TargetIpsPopup.test.jsx
--- old/d-installer/src/components/network/TargetIpsPopup.test.jsx      
2022-12-05 16:55:34.000000000 +0100
+++ new/d-installer/src/components/network/TargetIpsPopup.test.jsx      
2022-12-15 15:26:34.000000000 +0100
@@ -34,7 +34,8 @@
   { address: "5.6.7.8", prefix: 16 },
 ];
 const addressFn = jest.fn().mockReturnValue(addresses);
-const hostnameFn = jest.fn().mockReturnValue("example.net");
+const networkSettings = { wireless: false, hostname: "example.net" };
+const settingsFn = jest.fn().mockReturnValue(networkSettings);
 
 describe("TargetIpsPopup", () => {
   let callbacks;
@@ -46,7 +47,7 @@
         network: {
           onNetworkEvent: onNetworkEventFn,
           addresses: addressFn,
-          hostname: hostnameFn,
+          settings: settingsFn,
           setUp: jest.fn().mockResolvedValue()
         }
       };
@@ -77,7 +78,7 @@
     await screen.findByRole("button", { name: /1.2.3.4\/24 \(example.net\)/i 
});
 
     addressFn.mockReturnValue([{ address: "5.6.7.8", prefix: 24 }]);
-    hostnameFn.mockReturnValue("localhost.localdomain");
+    settingsFn.mockReturnValue({ wireless: false, hostname: 
"localhost.localdomain" });
     act(() => {
       callbacks.forEach(cb => cb());
     });
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/d-installer/src/components/network/WifiSelector.jsx 
new/d-installer/src/components/network/WifiSelector.jsx
--- old/d-installer/src/components/network/WifiSelector.jsx     2022-12-05 
16:55:34.000000000 +0100
+++ new/d-installer/src/components/network/WifiSelector.jsx     2022-12-15 
15:26:34.000000000 +0100
@@ -84,7 +84,7 @@
       setNetworks(data);
       setActiveNetwork(networksFromValues(data).find(d => d.connection));
     });
-  }, [client.network, connections, activeConnections]);
+  }, [client.network, connections, activeConnections, isOpen]);
 
   useEffect(() => {
     return client.network.onNetworkEvent(({ type, payload }) => {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/d-installer/src/components/storage/ProposalSettingsSection.test.jsx 
new/d-installer/src/components/storage/ProposalSettingsSection.test.jsx
--- old/d-installer/src/components/storage/ProposalSettingsSection.test.jsx     
2022-12-05 16:55:34.000000000 +0100
+++ new/d-installer/src/components/storage/ProposalSettingsSection.test.jsx     
2022-12-15 15:26:34.000000000 +0100
@@ -35,16 +35,11 @@
 
 jest.mock("@components/storage/ProposalSettingsForm", () => 
FakeProposalSettingsForm);
 
-let candidateDevices = ["/dev/sda"];
-let encryptionPassword = "";
-let lvm = false;
-let volumes = [{ mountPoint: "/test1" }, { mountPoint: "/test2" }];
-
-const proposal = {
-  candidateDevices,
-  encryptionPassword,
-  lvm,
-  volumes
+let proposal = {
+  candidateDevices: ["/dev/sda"],
+  encryptionPassword: "",
+  lvm: false,
+  volumes: [{ mountPoint: "/test1" }, { mountPoint: "/test2" }]
 };
 
 it("renders the list of the volumes to create", () => {
@@ -111,16 +106,54 @@
   expect(calculateFn).toHaveBeenCalled();
 });
 
-describe("when lvm and encryption are not selected", () => {
+describe("when neither lvm nor encryption are selected", () => {
   beforeEach(() => {
-    lvm = false;
-    encryptionPassword = "";
+    proposal.lvm = false;
+    proposal.encryptionPassword = "";
   });
 
-  it("renders the proper description for the selected settings", () => {
+  it("renders the proper description for the current settings", () => {
     installerRender(<ProposalSettingsSection proposal={proposal} />);
 
     screen.getByText(/Create file systems over partitions/);
   });
 });
 
+describe("when lvm is selected", () => {
+  beforeEach(() => {
+    proposal.lvm = true;
+    proposal.encryptionPassword = "";
+  });
+
+  it("renders the proper description for the current settings", () => {
+    installerRender(<ProposalSettingsSection proposal={proposal} />);
+
+    screen.getByText(/Create file systems over LVM volumes/);
+  });
+});
+
+describe("when encryption is selected", () => {
+  beforeEach(() => {
+    proposal.lvm = false;
+    proposal.encryptionPassword = "12345"
+  });
+
+  it("renders the proper description for the current settings", () => {
+    installerRender(<ProposalSettingsSection proposal={proposal} />);
+
+    screen.getByText(/Create file systems over encrypted partitions/);
+  });
+});
+
+describe("when LVM and encryption are selected", () => {
+  beforeEach(() => {
+    proposal.lvm = true;
+    proposal.encryptionPassword = "12345"
+  });
+
+  it("renders the proper description for the current settings", () => {
+    installerRender(<ProposalSettingsSection proposal={proposal} />);
+
+    screen.getByText(/Create file systems over encrypted LVM volumes/);
+  });
+});

++++++ d-installer.obsinfo ++++++
--- /var/tmp/diff_new_pack.dPk0D6/_old  2022-12-23 10:21:38.075525946 +0100
+++ /var/tmp/diff_new_pack.dPk0D6/_new  2022-12-23 10:21:38.079525969 +0100
@@ -1,5 +1,5 @@
 name: d-installer
-version: 0.6.1a0b3e2
-mtime: 1670255734
-commit: 1a0b3e2b303537fee3a88f7a3d0e2dec610f481d
+version: 0.6.2.09d561d
+mtime: 1671114394
+commit: 09d561d396a67c71664c01ceb8204dcc56e24da0
 

++++++ node_modules.obscpio ++++++
/work/SRC/openSUSE:Factory/cockpit-d-installer/node_modules.obscpio 
/work/SRC/openSUSE:Factory/.cockpit-d-installer.new.1563/node_modules.obscpio 
differ: char 50, line 1

Reply via email to