diff --git a/hackfest_virtual-pc_ns/hackfest_virtual-pc_nsd.yaml b/hackfest_virtual-pc_ns/hackfest_virtual-pc_nsd.yaml index 497fc1c22784cbdff6467d4f932110a88694f73c..e308d987a39235eaaf2ae7802d9e3340f8e677b9 100644 --- a/hackfest_virtual-pc_ns/hackfest_virtual-pc_nsd.yaml +++ b/hackfest_virtual-pc_ns/hackfest_virtual-pc_nsd.yaml @@ -15,7 +15,7 @@ # under the License. nsd: nsd: - - description: Virtual Desktop Computer with Xubuntu Desktop and RDP + - description: Virtual Desktop Computer with Mate Desktop and RDP designer: OSM df: - id: default-df diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/actions.yaml b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/actions.yaml index 867b12fb7529627480b3ecf66786f510becf471a..e4b157ae1c0dfd901e05a717309ca3420171b6fe 100644 --- a/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/actions.yaml +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/actions.yaml @@ -15,6 +15,26 @@ add-package: required: - package +add-snap: + description: "Adds software packages from snap store." + params: + package: + description: "Names of packages to add, comma delimited." + type: string + default: "" + required: + - package + +announce: + description: "Sends a message to logged in users" + params: + message: + description: "Message to send" + type: string + default: "" + required: + - message + reboot: description: "Reboots the server." @@ -28,6 +48,16 @@ remove-package: required: - package +remove-snap: + description: "Adds software packages from snap store." + params: + package: + description: "Names of packages to add, comma delimited." + type: string + default: "" + required: + - package + update-system: description: "Updates all software to latest version." diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/src/charm.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/src/charm.py index 579645795e3905e00db0ba2cf98c96e7906e44cd..e8581175cee7e2876563eb60f75bc2620dc36181 100755 --- a/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/src/charm.py +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/src/charm.py @@ -20,7 +20,9 @@ from utils import ( service_stop, service_restart, install_apt, + remove_apt, shell, + upgrade_apt, ) @@ -31,16 +33,19 @@ APT_PROXY_PATH = "/etc/apt/apt.conf.d/99-HIVE-apt-proxy" APT_PROXY_TEMPLATE = "./templates/proxy" APT_REQUIREMENTS = [ "firefox", - "mate-desktop", # 469 packages + "indicator-applet-session", + "libnotify-bin", + "mate-desktop", "mate-applets", "mate-applet-brisk-menu", "mate-indicator-applet", + "mate-notification-daemon", "mate-session-manager", "mate-terminal", "xrdp", ] SNAP_INSTALLS = [ - "code --classic", + #"code --classic", ] POLKIT_TEMPLATE = "./templates/color.pkla" POLKIT_PATH = "/etc/polkit-1/localauthority/50-local.d/color.pkla" @@ -69,8 +74,11 @@ class VirtualPCCharm(CharmBase, InstallProgress): # Actions hooks self.framework.observe(self.on["add-package"].action, self._add_package) + self.framework.observe(self.on["add-snap"].action, self._add_snap) + self.framework.observe(self.on["announce"].action, self._announce) self.framework.observe(self.on["reboot"].action, self._reboot) self.framework.observe(self.on["remove-package"].action, self._remove_package) + self.framework.observe(self.on["remove-snap"].action, self._remove_snap) self.framework.observe(self.on["update-system"].action, self._update_system) # Relations hooks @@ -116,6 +124,7 @@ class VirtualPCCharm(CharmBase, InstallProgress): polkit.write(content) self._stored.installed = True + self.unit.status = self._get_current_status() def _on_start(self, _): self.unit.status = MaintenanceStatus("Starting XRDP server") @@ -135,25 +144,44 @@ class VirtualPCCharm(CharmBase, InstallProgress): self.unit.status = self._get_current_status() # Action hooks - def _add_package(self, _): + def _add_package(self, event): self.unit.status = MaintenanceStatus("Installing apt packages") install_apt(packages=event.params["package"].split(','), update=True, progress=self) self.unit.status = self._get_current_status() + def _add_snap(self, event): + self.unit.status = MaintenanceStatus("Installing snaps") + for snap in event.params["package"].split(','): + shell("sudo snap install " + snap) + self.unit.status = self._get_current_status() + + def _announce(self, event): + self.unit.status = MaintenanceStatus("Announce") + shell("su - ubuntu -c 'XDG_RUNTIME_DIR=/run/user/$(id -u) notify-send \"" + message + "\"'") + self.unit.status = self._get_current_status() + def _reboot(self, _): self.unit.status = MaintenanceStatus("Rebooting server") - shell("reboot --reboot") + shell("su - ubuntu -c 'XDG_RUNTIME_DIR=/run/user/$(id -u) notify-send \"System is going down for reboot in 60 seconds\" -u critical'") + shell("shutdown -r +1") self.unit.status = self._get_current_status() - def _remove_package(self, _): + def _remove_package(self, event): self.unit.status = MaintenanceStatus("Removing apt packages") remove_apt(packages=event.params["package"].split(','), update=True, progress=self) self.unit.status = self._get_current_status() + def _remove_snap(self, event): + self.unit.status = MaintenanceStatus("Removing snaps") + for snap in event.params["package"].split(','): + shell("sudo snap remove" + snap) + self.unit.status = self._get_current_status() + def _update_system(self, _): self.unit.status = MaintenanceStatus("Updating system") + upgrade_apt(update=True, progress=self) self.unit.status = self._get_current_status() # Relation hooks diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/src/utils.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/src/utils.py index a8dce1bf65ca03fc7c4a0c6f4f781f4d155966b4..c2df3c225b902ed20107eecd8b894067af8831fe 100644 --- a/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/src/utils.py +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc-src/src/utils.py @@ -19,7 +19,6 @@ def all_values_set(dictionary: Dict[str, str]) -> bool: def install_apt(packages: List, update: bool = False, progress=None) -> NoReturn: - cache = apt.cache.Cache() if update: cache.update() @@ -31,16 +30,25 @@ def install_apt(packages: List, update: bool = False, progress=None) -> NoReturn cache.commit(install_progress=progress) -def remove_apt(packages: List, update: bool = False) -> NoReturn: +def remove_apt(packages: List, update: bool = False, progress=None) -> NoReturn: cache = apt.cache.Cache() if update: cache.update() cache.open() for package in packages: pkg = cache[package] - if not pkg.is_installed: + if pkg.is_installed: pkg.mark_delete() - cache.commit() + cache.commit(install_progress=progress) + + +def upgrade_apt(update: bool = False, progress=None) -> NoReturn: + cache = apt.cache.Cache() + if update: + cache.update() + cache.open() + cache.upgrade(dist_upgrade=True) + cache.commit(install_progress=progress) def shell(command: str) -> NoReturn: diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/actions.yaml b/hackfest_virtual-pc_vnfd/charms/virtual-pc/actions.yaml index 867b12fb7529627480b3ecf66786f510becf471a..e4b157ae1c0dfd901e05a717309ca3420171b6fe 100644 --- a/hackfest_virtual-pc_vnfd/charms/virtual-pc/actions.yaml +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/actions.yaml @@ -15,6 +15,26 @@ add-package: required: - package +add-snap: + description: "Adds software packages from snap store." + params: + package: + description: "Names of packages to add, comma delimited." + type: string + default: "" + required: + - package + +announce: + description: "Sends a message to logged in users" + params: + message: + description: "Message to send" + type: string + default: "" + required: + - message + reboot: description: "Reboots the server." @@ -28,6 +48,16 @@ remove-package: required: - package +remove-snap: + description: "Adds software packages from snap store." + params: + package: + description: "Names of packages to add, comma delimited." + type: string + default: "" + required: + - package + update-system: description: "Updates all software to latest version." diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/src/charm.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc/src/charm.py index 579645795e3905e00db0ba2cf98c96e7906e44cd..e8581175cee7e2876563eb60f75bc2620dc36181 100755 --- a/hackfest_virtual-pc_vnfd/charms/virtual-pc/src/charm.py +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/src/charm.py @@ -20,7 +20,9 @@ from utils import ( service_stop, service_restart, install_apt, + remove_apt, shell, + upgrade_apt, ) @@ -31,16 +33,19 @@ APT_PROXY_PATH = "/etc/apt/apt.conf.d/99-HIVE-apt-proxy" APT_PROXY_TEMPLATE = "./templates/proxy" APT_REQUIREMENTS = [ "firefox", - "mate-desktop", # 469 packages + "indicator-applet-session", + "libnotify-bin", + "mate-desktop", "mate-applets", "mate-applet-brisk-menu", "mate-indicator-applet", + "mate-notification-daemon", "mate-session-manager", "mate-terminal", "xrdp", ] SNAP_INSTALLS = [ - "code --classic", + #"code --classic", ] POLKIT_TEMPLATE = "./templates/color.pkla" POLKIT_PATH = "/etc/polkit-1/localauthority/50-local.d/color.pkla" @@ -69,8 +74,11 @@ class VirtualPCCharm(CharmBase, InstallProgress): # Actions hooks self.framework.observe(self.on["add-package"].action, self._add_package) + self.framework.observe(self.on["add-snap"].action, self._add_snap) + self.framework.observe(self.on["announce"].action, self._announce) self.framework.observe(self.on["reboot"].action, self._reboot) self.framework.observe(self.on["remove-package"].action, self._remove_package) + self.framework.observe(self.on["remove-snap"].action, self._remove_snap) self.framework.observe(self.on["update-system"].action, self._update_system) # Relations hooks @@ -116,6 +124,7 @@ class VirtualPCCharm(CharmBase, InstallProgress): polkit.write(content) self._stored.installed = True + self.unit.status = self._get_current_status() def _on_start(self, _): self.unit.status = MaintenanceStatus("Starting XRDP server") @@ -135,25 +144,44 @@ class VirtualPCCharm(CharmBase, InstallProgress): self.unit.status = self._get_current_status() # Action hooks - def _add_package(self, _): + def _add_package(self, event): self.unit.status = MaintenanceStatus("Installing apt packages") install_apt(packages=event.params["package"].split(','), update=True, progress=self) self.unit.status = self._get_current_status() + def _add_snap(self, event): + self.unit.status = MaintenanceStatus("Installing snaps") + for snap in event.params["package"].split(','): + shell("sudo snap install " + snap) + self.unit.status = self._get_current_status() + + def _announce(self, event): + self.unit.status = MaintenanceStatus("Announce") + shell("su - ubuntu -c 'XDG_RUNTIME_DIR=/run/user/$(id -u) notify-send \"" + message + "\"'") + self.unit.status = self._get_current_status() + def _reboot(self, _): self.unit.status = MaintenanceStatus("Rebooting server") - shell("reboot --reboot") + shell("su - ubuntu -c 'XDG_RUNTIME_DIR=/run/user/$(id -u) notify-send \"System is going down for reboot in 60 seconds\" -u critical'") + shell("shutdown -r +1") self.unit.status = self._get_current_status() - def _remove_package(self, _): + def _remove_package(self, event): self.unit.status = MaintenanceStatus("Removing apt packages") remove_apt(packages=event.params["package"].split(','), update=True, progress=self) self.unit.status = self._get_current_status() + def _remove_snap(self, event): + self.unit.status = MaintenanceStatus("Removing snaps") + for snap in event.params["package"].split(','): + shell("sudo snap remove" + snap) + self.unit.status = self._get_current_status() + def _update_system(self, _): self.unit.status = MaintenanceStatus("Updating system") + upgrade_apt(update=True, progress=self) self.unit.status = self._get_current_status() # Relation hooks diff --git a/hackfest_virtual-pc_vnfd/charms/virtual-pc/src/utils.py b/hackfest_virtual-pc_vnfd/charms/virtual-pc/src/utils.py index a8dce1bf65ca03fc7c4a0c6f4f781f4d155966b4..c2df3c225b902ed20107eecd8b894067af8831fe 100644 --- a/hackfest_virtual-pc_vnfd/charms/virtual-pc/src/utils.py +++ b/hackfest_virtual-pc_vnfd/charms/virtual-pc/src/utils.py @@ -19,7 +19,6 @@ def all_values_set(dictionary: Dict[str, str]) -> bool: def install_apt(packages: List, update: bool = False, progress=None) -> NoReturn: - cache = apt.cache.Cache() if update: cache.update() @@ -31,16 +30,25 @@ def install_apt(packages: List, update: bool = False, progress=None) -> NoReturn cache.commit(install_progress=progress) -def remove_apt(packages: List, update: bool = False) -> NoReturn: +def remove_apt(packages: List, update: bool = False, progress=None) -> NoReturn: cache = apt.cache.Cache() if update: cache.update() cache.open() for package in packages: pkg = cache[package] - if not pkg.is_installed: + if pkg.is_installed: pkg.mark_delete() - cache.commit() + cache.commit(install_progress=progress) + + +def upgrade_apt(update: bool = False, progress=None) -> NoReturn: + cache = apt.cache.Cache() + if update: + cache.update() + cache.open() + cache.upgrade(dist_upgrade=True) + cache.commit(install_progress=progress) def shell(command: str) -> NoReturn: diff --git a/hackfest_virtual-pc_vnfd/virtual-pc_vnfd.yaml b/hackfest_virtual-pc_vnfd/virtual-pc_vnfd.yaml index 78484dd737cab871ca565f3254e6d7e1a80a500c..511baf03fda4e2d659a2929fe83580dd6dfac05d 100644 --- a/hackfest_virtual-pc_vnfd/virtual-pc_vnfd.yaml +++ b/hackfest_virtual-pc_vnfd/virtual-pc_vnfd.yaml @@ -17,7 +17,7 @@ vnfd: ssh-access: default-user: ubuntu required: true - id: virtual-pc + id: hackfest_virtual-pc_vnf execution-environment-list: - id: virtual-pc-ee juju: @@ -33,6 +33,16 @@ vnfd: parameter: - data-type: STRING name: package + - name: add-snap + execution-environment-ref: virtual-pc-ee + parameter: + - data-type: STRING + name: package + - name: announce + execution-environment-ref: virtual-pc-ee + parameter: + - data-type: STRING + name: message - name: reboot execution-environment-ref: virtual-pc-ee - name: remove-package @@ -40,6 +50,11 @@ vnfd: parameter: - data-type: STRING name: package + - name: remove-snap + execution-environment-ref: virtual-pc-ee + parameter: + - data-type: STRING + name: package - name: update-system execution-environment-ref: virtual-pc-ee