diff --git a/charms/aodh-k8s/src/charm.py b/charms/aodh-k8s/src/charm.py index cb5c730c..81710a01 100755 --- a/charms/aodh-k8s/src/charm.py +++ b/charms/aodh-k8s/src/charm.py @@ -23,6 +23,7 @@ from typing import ( List, ) +import ops import ops.pebble import ops_sunbeam.charm as sunbeam_charm import ops_sunbeam.container_handlers as sunbeam_chandlers @@ -31,9 +32,6 @@ import ops_sunbeam.tracing as sunbeam_tracing from ops.framework import ( StoredState, ) -from ops.main import ( - main, -) logger = logging.getLogger(__name__) @@ -350,5 +348,5 @@ class AodhOperatorCharm(sunbeam_charm.OSBaseOperatorAPICharm): return pebble_handlers -if __name__ == "__main__": - main(AodhOperatorCharm) +if __name__ == "__main__": # pragma: nocover + ops.main(AodhOperatorCharm) diff --git a/charms/barbican-k8s/src/charm.py b/charms/barbican-k8s/src/charm.py index c4f717f7..8b141413 100755 --- a/charms/barbican-k8s/src/charm.py +++ b/charms/barbican-k8s/src/charm.py @@ -43,9 +43,6 @@ from ops import ( model, pebble, ) -from ops.main import ( - main, -) logger = logging.getLogger(__name__) @@ -509,5 +506,5 @@ class BarbicanVaultOperatorCharm(BarbicanOperatorCharm): return None -if __name__ == "__main__": - main(BarbicanVaultOperatorCharm) +if __name__ == "__main__": # pragma: nocover + ops.main(BarbicanVaultOperatorCharm) diff --git a/charms/ceilometer-k8s/src/charm.py b/charms/ceilometer-k8s/src/charm.py index 89b56d0d..5d61edf6 100755 --- a/charms/ceilometer-k8s/src/charm.py +++ b/charms/ceilometer-k8s/src/charm.py @@ -25,6 +25,7 @@ from typing import ( List, ) +import ops import ops.charm import ops.framework import ops_sunbeam.charm as sunbeam_charm @@ -39,9 +40,6 @@ from charms.ceilometer_k8s.v0.ceilometer_service import ( from ops.charm import ( CharmBase, ) -from ops.main import ( - main, -) logger = logging.getLogger(__name__) @@ -312,5 +310,5 @@ class CeilometerOperatorCharm(sunbeam_charm.OSBaseOperatorCharmK8S): logging.debug("Telemetry secret not yet set, not sending config") -if __name__ == "__main__": - main(CeilometerOperatorCharm) +if __name__ == "__main__": # pragma: nocover + ops.main(CeilometerOperatorCharm) diff --git a/charms/cinder-ceph-k8s/src/charm.py b/charms/cinder-ceph-k8s/src/charm.py index fc680f8f..1bb904cc 100755 --- a/charms/cinder-ceph-k8s/src/charm.py +++ b/charms/cinder-ceph-k8s/src/charm.py @@ -31,6 +31,7 @@ from typing import ( import charms.cinder_ceph_k8s.v0.ceph_access as sunbeam_ceph_access # noqa import charms.cinder_k8s.v0.storage_backend as sunbeam_storage_backend # noqa +import ops import ops.charm import ops_sunbeam.charm as charm import ops_sunbeam.config_contexts as config_contexts @@ -40,9 +41,6 @@ import ops_sunbeam.guard as sunbeam_guard import ops_sunbeam.relation_handlers as relation_handlers import ops_sunbeam.relation_handlers as sunbeam_rhandlers import ops_sunbeam.tracing as sunbeam_tracing -from ops.main import ( - main, -) from ops.model import ( Relation, SecretRotate, @@ -484,5 +482,5 @@ class CinderCephOperatorCharm(charm.OSBaseOperatorCharmK8S): self.send_ceph_access_credentials(relation) -if __name__ == "__main__": - main(CinderCephOperatorCharm) +if __name__ == "__main__": # pragma: nocover + ops.main(CinderCephOperatorCharm) diff --git a/charms/cinder-k8s/src/charm.py b/charms/cinder-k8s/src/charm.py index f8c9ec61..f8a56854 100755 --- a/charms/cinder-k8s/src/charm.py +++ b/charms/cinder-k8s/src/charm.py @@ -29,15 +29,13 @@ from typing import ( ) import charms.cinder_k8s.v0.storage_backend as sunbeam_storage_backend # noqa +import ops import ops.pebble import ops_sunbeam.charm as sunbeam_charm import ops_sunbeam.container_handlers as sunbeam_chandlers import ops_sunbeam.core as sunbeam_core import ops_sunbeam.relation_handlers as sunbeam_rhandlers import ops_sunbeam.tracing as sunbeam_tracing -from ops.main import ( - main, -) logger = logging.getLogger(__name__) @@ -336,5 +334,5 @@ class CinderOperatorCharm(sunbeam_charm.OSBaseOperatorAPICharm): self.sb_svc.set_ready() -if __name__ == "__main__": - main(CinderOperatorCharm) +if __name__ == "__main__": # pragma: nocover + ops.main(CinderOperatorCharm) diff --git a/charms/designate-bind-k8s/src/charm.py b/charms/designate-bind-k8s/src/charm.py index 88301506..de96c29f 100755 --- a/charms/designate-bind-k8s/src/charm.py +++ b/charms/designate-bind-k8s/src/charm.py @@ -35,6 +35,7 @@ from typing import ( import charms.designate_bind_k8s.v0.bind_rndc as bind_rndc import charms.observability_libs.v1.kubernetes_service_patch as kubernetes_service_patch import lightkube.models.core_v1 as core_v1 +import ops import ops.charm import ops_sunbeam.charm as sunbeam_charm import ops_sunbeam.container_handlers as sunbeam_chandlers @@ -44,9 +45,6 @@ import ops_sunbeam.tracing as sunbeam_tracing from ops.framework import ( StoredState, ) -from ops.main import ( - main, -) logger = logging.getLogger(__name__) @@ -546,5 +544,5 @@ class BindOperatorCharm(sunbeam_charm.OSBaseOperatorCharmK8S): return bool(missing_nonces) -if __name__ == "__main__": - main(BindOperatorCharm) +if __name__ == "__main__": # pragma: nocover + ops.main(BindOperatorCharm) diff --git a/charms/designate-k8s/src/charm.py b/charms/designate-k8s/src/charm.py index 204c4dfc..5080af5f 100755 --- a/charms/designate-k8s/src/charm.py +++ b/charms/designate-k8s/src/charm.py @@ -45,9 +45,6 @@ from charms.designate_k8s.v0.designate_service import ( DesignateEndpointRequestEvent, DesignateServiceProvides, ) -from ops.main import ( - main, -) logger = logging.getLogger(__name__) @@ -566,5 +563,5 @@ class DesignateOperatorCharm(sunbeam_charm.OSBaseOperatorAPICharm): logging.debug("DNS Endpoint not yet set, not sending config") -if __name__ == "__main__": - main(DesignateOperatorCharm) +if __name__ == "__main__": # pragma: nocover + ops.main(DesignateOperatorCharm) diff --git a/charms/glance-k8s/src/charm.py b/charms/glance-k8s/src/charm.py index a0b3e5dc..45163de8 100755 --- a/charms/glance-k8s/src/charm.py +++ b/charms/glance-k8s/src/charm.py @@ -29,6 +29,7 @@ from typing import ( List, ) +import ops import ops_sunbeam.charm as sunbeam_charm import ops_sunbeam.compound_status as compound_status import ops_sunbeam.config_contexts as sunbeam_ctxts @@ -54,9 +55,6 @@ from ops.framework import ( EventBase, StoredState, ) -from ops.main import ( - main, -) from ops.model import ( ActiveStatus, BlockedStatus, @@ -600,5 +598,5 @@ class GlanceOperatorCharm(sunbeam_charm.OSBaseOperatorAPICharm): return bytes_from_string(pvc.status.capacity["storage"]) -if __name__ == "__main__": - main(GlanceOperatorCharm) +if __name__ == "__main__": # pragma: nocover + ops.main(GlanceOperatorCharm) diff --git a/charms/gnocchi-k8s/src/charm.py b/charms/gnocchi-k8s/src/charm.py index 7eb30746..b5ef4fd2 100755 --- a/charms/gnocchi-k8s/src/charm.py +++ b/charms/gnocchi-k8s/src/charm.py @@ -44,9 +44,6 @@ from ops.framework import ( EventBase, StoredState, ) -from ops.main import ( - main, -) logger = logging.getLogger(__name__) @@ -406,5 +403,5 @@ class GnocchiCephOperatorCharm(GnocchiOperatorCharm): return _cconfigs -if __name__ == "__main__": - main(GnocchiCephOperatorCharm) +if __name__ == "__main__": # pragma: nocover + ops.main(GnocchiCephOperatorCharm) diff --git a/charms/heat-k8s/src/charm.py b/charms/heat-k8s/src/charm.py index 7ed9db09..17ac7bcc 100755 --- a/charms/heat-k8s/src/charm.py +++ b/charms/heat-k8s/src/charm.py @@ -39,9 +39,6 @@ import ops_sunbeam.tracing as sunbeam_tracing from ops.framework import ( StoredState, ) -from ops.main import ( - main, -) from ops.model import ( ModelError, ) @@ -686,5 +683,5 @@ class HeatOperatorCharm(sunbeam_charm.OSBaseOperatorAPICharm): logger.warning("Heat stack user role creation failed.") -if __name__ == "__main__": - main(HeatOperatorCharm) +if __name__ == "__main__": # pragma: nocover + ops.main(HeatOperatorCharm) diff --git a/charms/horizon-k8s/src/charm.py b/charms/horizon-k8s/src/charm.py index aaa33e62..0337337d 100755 --- a/charms/horizon-k8s/src/charm.py +++ b/charms/horizon-k8s/src/charm.py @@ -25,6 +25,7 @@ from typing import ( List, ) +import ops import ops.framework import ops.model import ops.pebble @@ -33,9 +34,6 @@ import ops_sunbeam.container_handlers as sunbeam_chandlers import ops_sunbeam.core as sunbeam_core import ops_sunbeam.guard as sunbeam_guard import ops_sunbeam.tracing as sunbeam_tracing -from ops.main import ( - main, -) logger = logging.getLogger(__name__) @@ -287,5 +285,5 @@ class HorizonOperatorCharm(sunbeam_charm.OSBaseOperatorAPICharm): return "30s" -if __name__ == "__main__": - main(HorizonOperatorCharm) +if __name__ == "__main__": # pragma: nocover + ops.main(HorizonOperatorCharm) diff --git a/charms/keystone-k8s/src/charm.py b/charms/keystone-k8s/src/charm.py index 76d55551..b2ee0ca8 100755 --- a/charms/keystone-k8s/src/charm.py +++ b/charms/keystone-k8s/src/charm.py @@ -50,6 +50,7 @@ import charms.keystone_k8s.v0.identity_resource as sunbeam_ops_svc import charms.keystone_k8s.v1.identity_service as sunbeam_id_svc import jinja2 import keystoneauth1.exceptions +import ops import ops.charm import ops.pebble import ops_sunbeam.charm as sunbeam_charm @@ -71,9 +72,6 @@ from ops.charm import ( from ops.framework import ( StoredState, ) -from ops.main import ( - main, -) from ops.model import ( MaintenanceStatus, ModelError, @@ -1821,5 +1819,5 @@ export OS_AUTH_VERSION=3 self._handle_certificate_transfers([event.relation]) -if __name__ == "__main__": - main(KeystoneOperatorCharm) +if __name__ == "__main__": # pragma: nocover + ops.main(KeystoneOperatorCharm) diff --git a/charms/keystone-ldap-k8s/src/charm.py b/charms/keystone-ldap-k8s/src/charm.py index 473123e8..832e3681 100755 --- a/charms/keystone-ldap-k8s/src/charm.py +++ b/charms/keystone-ldap-k8s/src/charm.py @@ -31,14 +31,12 @@ from typing import ( import charms.keystone_k8s.v0.domain_config as sunbeam_dc_svc import jinja2 +import ops import ops.charm import ops_sunbeam.charm as sunbeam_charm import ops_sunbeam.config_contexts as config_contexts import ops_sunbeam.relation_handlers as sunbeam_rhandlers import ops_sunbeam.tracing as sunbeam_tracing -from ops.main import ( - main, -) # Log messages can be retrieved using juju debug-log logger = logging.getLogger(__name__) @@ -158,4 +156,4 @@ class KeystoneLDAPK8SCharm(sunbeam_charm.OSBaseOperatorCharm): if __name__ == "__main__": # pragma: nocover - main(KeystoneLDAPK8SCharm) + ops.main(KeystoneLDAPK8SCharm) diff --git a/charms/magnum-k8s/src/charm.py b/charms/magnum-k8s/src/charm.py index 283deb57..a2b86ca5 100755 --- a/charms/magnum-k8s/src/charm.py +++ b/charms/magnum-k8s/src/charm.py @@ -33,9 +33,6 @@ import ops_sunbeam.tracing as sunbeam_tracing from ops.framework import ( StoredState, ) -from ops.main import ( - main, -) logger = logging.getLogger(__name__) @@ -305,5 +302,5 @@ class MagnumOperatorCharm(sunbeam_charm.OSBaseOperatorAPICharm): logger.warning("Magnum domain admin role creation failed.") -if __name__ == "__main__": - main(MagnumOperatorCharm) +if __name__ == "__main__": # pragma: nocover + ops.main(MagnumOperatorCharm) diff --git a/charms/neutron-k8s/src/charm.py b/charms/neutron-k8s/src/charm.py index 09b7d6b4..799d0c9e 100755 --- a/charms/neutron-k8s/src/charm.py +++ b/charms/neutron-k8s/src/charm.py @@ -40,9 +40,6 @@ import ops_sunbeam.tracing as sunbeam_tracing from ops.framework import ( StoredState, ) -from ops.main import ( - main, -) from ops.model import ( BlockedStatus, ) @@ -497,5 +494,5 @@ class NeutronOVNOperatorCharm(NeutronOperatorCharm): self._post_db_sync_restart() -if __name__ == "__main__": - main(NeutronOVNOperatorCharm) +if __name__ == "__main__": # pragma: nocover + ops.main(NeutronOVNOperatorCharm) diff --git a/charms/nova-k8s/src/charm.py b/charms/nova-k8s/src/charm.py index 87106a4e..cfabb31c 100755 --- a/charms/nova-k8s/src/charm.py +++ b/charms/nova-k8s/src/charm.py @@ -28,6 +28,7 @@ from typing import ( ) import charms.sunbeam_nova_compute_operator.v0.cloud_compute as cloud_compute +import ops import ops.framework import ops_sunbeam.charm as sunbeam_charm import ops_sunbeam.config_contexts as sunbeam_ctxts @@ -42,9 +43,6 @@ from charms.nova_k8s.v0.nova_service import ( from ops.charm import ( CharmBase, ) -from ops.main import ( - main, -) from ops.pebble import ( ExecError, ) @@ -851,5 +849,5 @@ class NovaOperatorCharm(sunbeam_charm.OSBaseOperatorAPICharm): logging.debug("Nova spiceproxy not yet set, not sending config") -if __name__ == "__main__": - main(NovaOperatorCharm) +if __name__ == "__main__": # pragma: nocover + ops.main(NovaOperatorCharm) diff --git a/charms/octavia-k8s/src/charm.py b/charms/octavia-k8s/src/charm.py index 25f4cd34..1a962dcd 100755 --- a/charms/octavia-k8s/src/charm.py +++ b/charms/octavia-k8s/src/charm.py @@ -37,9 +37,6 @@ import ops_sunbeam.tracing as sunbeam_tracing from ops.framework import ( StoredState, ) -from ops.main import ( - main, -) logger = logging.getLogger(__name__) OCTAVIA_API_CONTAINER = "octavia-api" @@ -403,5 +400,5 @@ class OctaviaOVNOperatorCharm(OctaviaOperatorCharm): self._state.unit_bootstrapped = True -if __name__ == "__main__": - main(OctaviaOVNOperatorCharm) +if __name__ == "__main__": # pragma: nocover + ops.main(OctaviaOVNOperatorCharm) diff --git a/charms/openstack-exporter-k8s/src/charm.py b/charms/openstack-exporter-k8s/src/charm.py index 28d02afa..40dc378d 100755 --- a/charms/openstack-exporter-k8s/src/charm.py +++ b/charms/openstack-exporter-k8s/src/charm.py @@ -34,9 +34,6 @@ import ops_sunbeam.container_handlers as sunbeam_chandlers import ops_sunbeam.core as sunbeam_core import ops_sunbeam.relation_handlers as sunbeam_rhandlers import ops_sunbeam.tracing as sunbeam_tracing -from ops.main import ( - main, -) logger = logging.getLogger(__name__) @@ -395,5 +392,5 @@ class OSExporterOperatorCharm(sunbeam_charm.OSBaseOperatorCharmK8S): break -if __name__ == "__main__": - main(OSExporterOperatorCharm) +if __name__ == "__main__": # pragma: nocover + ops.main(OSExporterOperatorCharm) diff --git a/charms/openstack-hypervisor/src/charm.py b/charms/openstack-hypervisor/src/charm.py index c2a385b2..c09ed4ee 100755 --- a/charms/openstack-hypervisor/src/charm.py +++ b/charms/openstack-hypervisor/src/charm.py @@ -34,6 +34,7 @@ from typing import ( ) import charms.operator_libs_linux.v2.snap as snap +import ops import ops.framework import ops_sunbeam.charm as sunbeam_charm import ops_sunbeam.core as sunbeam_core @@ -58,9 +59,6 @@ from cryptography import ( from ops.charm import ( ActionEvent, ) -from ops.main import ( - main, -) from utils import ( get_local_ip_by_default_route, ) @@ -561,4 +559,4 @@ class HypervisorOperatorCharm(sunbeam_charm.OSBaseOperatorCharm): if __name__ == "__main__": # pragma: no cover - main(HypervisorOperatorCharm) + ops.main(HypervisorOperatorCharm) diff --git a/charms/ovn-central-k8s/src/charm.py b/charms/ovn-central-k8s/src/charm.py index 2345a757..c2ccc27d 100755 --- a/charms/ovn-central-k8s/src/charm.py +++ b/charms/ovn-central-k8s/src/charm.py @@ -25,6 +25,7 @@ from typing import ( ) import charms.ovn_central_k8s.v0.ovsdb as ovsdb +import ops import ops.charm import ops.pebble import ops_sunbeam.charm as sunbeam_charm @@ -42,9 +43,6 @@ import tenacity from ops.framework import ( StoredState, ) -from ops.main import ( - main, -) logger = logging.getLogger(__name__) @@ -498,5 +496,5 @@ class OVNCentralOperatorCharm(sunbeam_charm.OSBaseOperatorCharmK8S): ) -if __name__ == "__main__": - main(OVNCentralOperatorCharm) +if __name__ == "__main__": # pragma: nocover + ops.main(OVNCentralOperatorCharm) diff --git a/charms/ovn-relay-k8s/src/charm.py b/charms/ovn-relay-k8s/src/charm.py index d685e8ce..49938b2f 100755 --- a/charms/ovn-relay-k8s/src/charm.py +++ b/charms/ovn-relay-k8s/src/charm.py @@ -35,6 +35,7 @@ from typing import ( Union, ) +import ops import ops_sunbeam.config_contexts as sunbeam_ctxts import ops_sunbeam.core as sunbeam_core import ops_sunbeam.ovn.charm as ovn_charm @@ -49,9 +50,6 @@ from charms.observability_libs.v1.kubernetes_service_patch import ( from lightkube.models.core_v1 import ( ServicePort, ) -from ops.main import ( - main, -) logger = logging.getLogger(__name__) @@ -174,5 +172,5 @@ class OVNRelayOperatorCharm(ovn_charm.OSBaseOVNOperatorCharm): return {} -if __name__ == "__main__": - main(OVNRelayOperatorCharm) +if __name__ == "__main__": # pragma: nocover + ops.main(OVNRelayOperatorCharm) diff --git a/charms/placement-k8s/src/charm.py b/charms/placement-k8s/src/charm.py index dc218712..a725a7fa 100755 --- a/charms/placement-k8s/src/charm.py +++ b/charms/placement-k8s/src/charm.py @@ -25,6 +25,7 @@ from typing import ( List, ) +import ops import ops.pebble import ops_sunbeam.charm as sunbeam_charm import ops_sunbeam.container_handlers as sunbeam_chandlers @@ -33,9 +34,6 @@ import ops_sunbeam.tracing as sunbeam_tracing from ops.framework import ( StoredState, ) -from ops.main import ( - main, -) logger = logging.getLogger(__name__) @@ -143,4 +141,4 @@ class PlacementOperatorCharm(sunbeam_charm.OSBaseOperatorAPICharm): if __name__ == "__main__": # pragma: no cover - main(PlacementOperatorCharm) + ops.main(PlacementOperatorCharm) diff --git a/charms/sunbeam-clusterd/src/charm.py b/charms/sunbeam-clusterd/src/charm.py index 040fdcdf..d9418706 100755 --- a/charms/sunbeam-clusterd/src/charm.py +++ b/charms/sunbeam-clusterd/src/charm.py @@ -29,6 +29,7 @@ from pathlib import ( ) import clusterd +import ops import ops.framework import ops_sunbeam.charm as sunbeam_charm import ops_sunbeam.guard as sunbeam_guard @@ -45,9 +46,6 @@ from charms.tls_certificates_interface.v3.tls_certificates import ( from cryptography import ( x509, ) -from ops.main import ( - main, -) from ops_sunbeam.relation_handlers import ( RelationHandler, ) @@ -621,4 +619,4 @@ class SunbeamClusterdCharm(sunbeam_charm.OSBaseOperatorCharm): if __name__ == "__main__": # pragma: nocover - main(SunbeamClusterdCharm) + ops.main(SunbeamClusterdCharm) diff --git a/charms/sunbeam-machine/src/charm.py b/charms/sunbeam-machine/src/charm.py index 78fb93fc..1eb9a884 100755 --- a/charms/sunbeam-machine/src/charm.py +++ b/charms/sunbeam-machine/src/charm.py @@ -23,6 +23,7 @@ subordinates that configure machine services. import logging +import ops import ops.framework import ops_sunbeam.charm as sunbeam_charm import ops_sunbeam.guard as sunbeam_guard @@ -30,9 +31,6 @@ import ops_sunbeam.tracing as sunbeam_tracing from charms.operator_libs_linux.v0 import ( sysctl, ) -from ops.main import ( - main, -) ETC_ENVIRONMENT = "/etc/environment" logger = logging.getLogger(__name__) @@ -101,4 +99,4 @@ class SunbeamMachineCharm(sunbeam_charm.OSBaseOperatorCharm): if __name__ == "__main__": # pragma: nocover - main(SunbeamMachineCharm) + ops.main(SunbeamMachineCharm) diff --git a/charms/tempest-k8s/src/charm.py b/charms/tempest-k8s/src/charm.py index 41836bf2..63ee7949 100755 --- a/charms/tempest-k8s/src/charm.py +++ b/charms/tempest-k8s/src/charm.py @@ -42,9 +42,6 @@ from handlers import ( TempestPebbleHandler, TempestUserIdentityRelationHandler, ) -from ops.main import ( - main, -) from ops.model import ( ActiveStatus, MaintenanceStatus, @@ -460,5 +457,5 @@ class TempestOperatorCharm(sunbeam_charm.OSBaseOperatorCharmK8S): print("\n".join(lists)) -if __name__ == "__main__": - main(TempestOperatorCharm) +if __name__ == "__main__": # pragma: nocover + ops.main(TempestOperatorCharm) diff --git a/ops-sunbeam/shared_code/sunbeam_charm/{{cookiecutter.service_name}}/src/charm.py b/ops-sunbeam/shared_code/sunbeam_charm/{{cookiecutter.service_name}}/src/charm.py index 176dd211..7f4a15bb 100644 --- a/ops-sunbeam/shared_code/sunbeam_charm/{{cookiecutter.service_name}}/src/charm.py +++ b/ops-sunbeam/shared_code/sunbeam_charm/{{cookiecutter.service_name}}/src/charm.py @@ -6,8 +6,8 @@ This charm provide {{ cookiecutter.service_name[0]|upper}}{{cookiecutter.service import logging +import ops from ops.framework import StoredState -from ops.main import main import ops_sunbeam.charm as sunbeam_charm @@ -59,5 +59,5 @@ class {{ cookiecutter.service_name[0]|upper}}{{cookiecutter.service_name[1:] }}O return {{ cookiecutter.ingress_port }} -if __name__ == "__main__": - main({{ cookiecutter.service_name[0]|upper}}{{cookiecutter.service_name[1:] }}OperatorCharm) +if __name__ == "__main__": # pragma: nocover + ops.main({{ cookiecutter.service_name[0]|upper}}{{cookiecutter.service_name[1:] }}OperatorCharm)