[cmc] Remove services from restricted_features

Services are now GA, no need to restrict them any longer.

Change-Id: Id5cc620d2c7b48344cdd777758ca628c1583bc49
Reviewed-on: https://fuchsia-review.googlesource.com/c/fuchsia/+/693827
Commit-Queue: Gary Bressler <geb@google.com>
Reviewed-by: Shai Barack <shayba@google.com>
Reviewed-by: Yegor Pomortsev <ypomortsev@google.com>
diff --git a/build/drivers/fuchsia_driver_component.gni b/build/drivers/fuchsia_driver_component.gni
index ae1737d4..c7fab80 100644
--- a/build/drivers/fuchsia_driver_component.gni
+++ b/build/drivers/fuchsia_driver_component.gni
@@ -229,7 +229,6 @@
         if (!defined(restricted_features)) {
           restricted_features = []
         }
-        restricted_features += [ "services" ]
       }
       if (!defined(deps)) {
         deps = []
diff --git a/docs/development/components/build.md b/docs/development/components/build.md
index 3e69aca..db56374 100644
--- a/docs/development/components/build.md
+++ b/docs/development/components/build.md
@@ -1071,8 +1071,8 @@
 ```gn
 fuchsia_component("my-component") {
   manifest = "meta/my-component.cml"
-  # This component opts-in to the restricted "services" feature.
-  restricted_features = [ "services" ]
+  # This component opts-in to the restricted "allow_long_names" feature.
+  restricted_features = [ "allow_long_names" ]
   deps = [ ... ]
 }
 ```
diff --git a/examples/components/services/BUILD.gn b/examples/components/services/BUILD.gn
index 5aaefc7..da5ccb7 100644
--- a/examples/components/services/BUILD.gn
+++ b/examples/components/services/BUILD.gn
@@ -57,14 +57,12 @@
   testonly = true
   component_name = "services"
   manifest = "meta/services.cml"
-  restricted_features = [ "services" ]
 }
 
 fuchsia_component("branch-cmp") {
   testonly = true
   component_name = "branch"
   manifest = "meta/branch.cml"
-  restricted_features = [ "services" ]
   deps = [ ":branch-bin" ]
 }
 
@@ -72,7 +70,6 @@
   testonly = true
   component_name = "provider-a"
   manifest = "meta/provider-a.cml"
-  restricted_features = [ "services" ]
   deps = [ ":provider-bin" ]
 }
 
@@ -80,7 +77,6 @@
   testonly = true
   component_name = "provider-b"
   manifest = "meta/provider-b.cml"
-  restricted_features = [ "services" ]
   deps = [ ":provider-bin" ]
 }
 
diff --git a/examples/drivers/v2/demo-number/BUILD.gn b/examples/drivers/v2/demo-number/BUILD.gn
index d3eae96..74663b1 100644
--- a/examples/drivers/v2/demo-number/BUILD.gn
+++ b/examples/drivers/v2/demo-number/BUILD.gn
@@ -37,7 +37,6 @@
   manifest = "meta/demo_number.cml"
   deps = [ ":driver" ]
   info = "component-info.json"
-  restricted_features = [ "services" ]
 }
 
 test("demo_number_test") {
diff --git a/examples/fidl/echo-realm/BUILD.gn b/examples/fidl/echo-realm/BUILD.gn
index 76703a8..cdf1450 100644
--- a/examples/fidl/echo-realm/BUILD.gn
+++ b/examples/fidl/echo-realm/BUILD.gn
@@ -8,7 +8,6 @@
 # Realm component used to launch FIDL examples
 fuchsia_component("echo_realm") {
   manifest = "meta/echo_realm.cml"
-  restricted_features = [ "services" ]
 }
 
 # Integration testing components for FIDL examples
diff --git a/examples/fidl/hlcpp/services/client/BUILD.gn b/examples/fidl/hlcpp/services/client/BUILD.gn
index 2bb88ae..3b4b380 100644
--- a/examples/fidl/hlcpp/services/client/BUILD.gn
+++ b/examples/fidl/hlcpp/services/client/BUILD.gn
@@ -20,5 +20,4 @@
   component_name = "echo_client"
   manifest = "meta/client.cml"
   deps = [ ":bin" ]
-  restricted_features = [ "services" ]
 }
diff --git a/examples/fidl/hlcpp/services/server/BUILD.gn b/examples/fidl/hlcpp/services/server/BUILD.gn
index a7d96af..aadc413 100644
--- a/examples/fidl/hlcpp/services/server/BUILD.gn
+++ b/examples/fidl/hlcpp/services/server/BUILD.gn
@@ -20,5 +20,4 @@
   component_name = "echo_server"
   manifest = "meta/server.cml"
   deps = [ ":bin" ]
-  restricted_features = [ "services" ]
 }
diff --git a/examples/fidl/llcpp/services/client/BUILD.gn b/examples/fidl/llcpp/services/client/BUILD.gn
index 50f8465..0b5e6b6 100644
--- a/examples/fidl/llcpp/services/client/BUILD.gn
+++ b/examples/fidl/llcpp/services/client/BUILD.gn
@@ -21,5 +21,4 @@
   component_name = "echo_client"
   manifest = "meta/client.cml"
   deps = [ ":bin" ]
-  restricted_features = [ "services" ]
 }
diff --git a/examples/fidl/llcpp/services/server/BUILD.gn b/examples/fidl/llcpp/services/server/BUILD.gn
index a63056f..3b51ea1 100644
--- a/examples/fidl/llcpp/services/server/BUILD.gn
+++ b/examples/fidl/llcpp/services/server/BUILD.gn
@@ -25,5 +25,4 @@
   component_name = "echo_server"
   manifest = "meta/server.cml"
   deps = [ ":bin" ]
-  restricted_features = [ "services" ]
 }
diff --git a/examples/fidl/rust/services/client/BUILD.gn b/examples/fidl/rust/services/client/BUILD.gn
index c7c5414..dd2338a 100644
--- a/examples/fidl/rust/services/client/BUILD.gn
+++ b/examples/fidl/rust/services/client/BUILD.gn
@@ -26,5 +26,4 @@
   component_name = "echo_client"
   manifest = "meta/client.cml"
   deps = [ ":bin" ]
-  restricted_features = [ "services" ]
 }
diff --git a/examples/fidl/rust/services/server/BUILD.gn b/examples/fidl/rust/services/server/BUILD.gn
index 886138a..d18b6be 100644
--- a/examples/fidl/rust/services/server/BUILD.gn
+++ b/examples/fidl/rust/services/server/BUILD.gn
@@ -26,5 +26,4 @@
   component_name = "echo_server"
   manifest = "meta/server.cml"
   deps = [ ":bin" ]
-  restricted_features = [ "services" ]
 }
diff --git a/sdk/lib/sys/component/cpp/tests/BUILD.gn b/sdk/lib/sys/component/cpp/tests/BUILD.gn
index e58e64c..88b4d07 100644
--- a/sdk/lib/sys/component/cpp/tests/BUILD.gn
+++ b/sdk/lib/sys/component/cpp/tests/BUILD.gn
@@ -203,7 +203,6 @@
   testonly = true
   deps = [ ":echo_service_server_bin" ]
   manifest = "meta/echo_service_server.cml"
-  restricted_features = [ "services" ]
 }
 
 fuchsia_component("echo_server_legacy") {
diff --git a/sdk/lib/sys/component/llcpp/tests/BUILD.gn b/sdk/lib/sys/component/llcpp/tests/BUILD.gn
index 5de78de..c9b18d9 100644
--- a/sdk/lib/sys/component/llcpp/tests/BUILD.gn
+++ b/sdk/lib/sys/component/llcpp/tests/BUILD.gn
@@ -64,7 +64,6 @@
   testonly = true
   deps = [ ":llcpp_echo_service_server_bin" ]
   manifest = "meta/llcpp_echo_service_server.cml"
-  restricted_features = [ "services" ]
 }
 
 fuchsia_component("outgoing_directory_test") {
diff --git a/src/devices/tests/v2/composite/BUILD.gn b/src/devices/tests/v2/composite/BUILD.gn
index 1555c44a..1886261 100644
--- a/src/devices/tests/v2/composite/BUILD.gn
+++ b/src/devices/tests/v2/composite/BUILD.gn
@@ -47,7 +47,6 @@
   manifest = "meta/root.cml"
   deps = [ ":root_driver" ]
   info = "root-info.json"
-  restricted_features = [ "services" ]
 }
 
 driver_bind_rules("composite_leaf_bind") {
@@ -74,7 +73,6 @@
   manifest = "meta/leaf.cml"
   deps = [ ":leaf_driver" ]
   info = "leaf-info.json"
-  restricted_features = [ "services" ]
 }
 
 rustc_test("bin") {
diff --git a/src/devices/tests/v2/interop/BUILD.gn b/src/devices/tests/v2/interop/BUILD.gn
index feb438b..db040e1 100644
--- a/src/devices/tests/v2/interop/BUILD.gn
+++ b/src/devices/tests/v2/interop/BUILD.gn
@@ -49,7 +49,6 @@
   manifest = "meta/root.cml"
   deps = [ ":root_driver" ]
   info = "root-info.json"
-  restricted_features = [ "services" ]
 }
 
 driver_bind_rules("interop_v1_bind") {
diff --git a/src/devices/tests/v2/services/BUILD.gn b/src/devices/tests/v2/services/BUILD.gn
index b3a2062..7214fb1 100644
--- a/src/devices/tests/v2/services/BUILD.gn
+++ b/src/devices/tests/v2/services/BUILD.gn
@@ -38,7 +38,6 @@
 fuchsia_driver_component("root") {
   testonly = true
   manifest = "meta/root.cml"
-  restricted_features = [ "services" ]
   deps = [ ":root_driver" ]
   info = "root-info.json"
 }
@@ -73,10 +72,7 @@
 
 fuchsia_test_component("realm") {
   manifest = "${target_out_dir}/realm.cml"
-  restricted_features = [
-    "dynamic_offers",
-    "services",
-  ]
+  restricted_features = [ "dynamic_offers" ]
   manifest_deps = [ ":realm.cml" ]
 }
 
diff --git a/src/storage/ext4/server/BUILD.gn b/src/storage/ext4/server/BUILD.gn
index 0ddd399..013feff 100644
--- a/src/storage/ext4/server/BUILD.gn
+++ b/src/storage/ext4/server/BUILD.gn
@@ -74,7 +74,6 @@
 fuchsia_component("ext4_readonly_comp") {
   component_name = "ext4_readonly"
   manifest = "meta/ext4_readonly.cml"
-  restricted_features = [ "services" ]
   deps = [ ":bin" ]
 }
 
@@ -102,7 +101,6 @@
   testonly = true
   component_name = "ext4_server_integration_test"
   manifest = "meta/ext4_server_integration_test.cml"
-  restricted_features = [ "services" ]
   deps = [
     ":ext4_server_integration_test",
     "//src/lib/storage/ramdevice_client:ramdisk-isolated-devmgr-component",
diff --git a/src/sys/component_manager/tests/services/BUILD.gn b/src/sys/component_manager/tests/services/BUILD.gn
index a7a5e78..86db921 100644
--- a/src/sys/component_manager/tests/services/BUILD.gn
+++ b/src/sys/component_manager/tests/services/BUILD.gn
@@ -33,7 +33,6 @@
 
 fuchsia_test_component("service-routing-branch") {
   manifest = "meta/service-routing-branch.cml"
-  restricted_features = [ "services" ]
   deps = [ ":service-routing-branch-bin" ]
 }
 
@@ -64,7 +63,6 @@
 
 fuchsia_test_component("service-routing-test") {
   manifest = "meta/service-routing-test.cml"
-  restricted_features = [ "services" ]
   deps = [ ":service-routing-test-bin" ]
 }
 
@@ -96,10 +94,7 @@
 
 fuchsia_test_component("filtered-service-routing-test") {
   manifest = "meta/filtered-service-routing-test.cml"
-  restricted_features = [
-    "services",
-    "dynamic_offers",
-  ]
+  restricted_features = [ "dynamic_offers" ]
   deps = [ ":filtered-service-routing-test-bin" ]
 }
 
@@ -127,7 +122,6 @@
 
 fuchsia_test_component("echo-service-client") {
   manifest = "meta/echo-service-client.cml"
-  restricted_features = [ "services" ]
   deps = [ ":service-routing-client-bin" ]
 }
 
@@ -151,7 +145,6 @@
 
 fuchsia_test_component("multi-instance-echo-provider") {
   manifest = "meta/multi-instance-echo-provider.cml"
-  restricted_features = [ "services" ]
   deps = [ ":multi_instance_echo_service_bin" ]
 }
 
diff --git a/src/sys/component_manager/tests/structured_config/client_integration/cpp_driver/BUILD.gn b/src/sys/component_manager/tests/structured_config/client_integration/cpp_driver/BUILD.gn
index d8f4a70..ff9b123 100644
--- a/src/sys/component_manager/tests/structured_config/client_integration/cpp_driver/BUILD.gn
+++ b/src/sys/component_manager/tests/structured_config/client_integration/cpp_driver/BUILD.gn
@@ -39,7 +39,6 @@
   testonly = true
   component_name = "cpp_driver_receiver"
   manifest = "meta/receiver.cml"
-  restricted_features = [ "services" ]
 }
 
 fuchsia_driver_component("receiver_component") {
@@ -100,10 +99,7 @@
 
 fuchsia_test_component("realm") {
   manifest = "${target_out_dir}/realm.cml"
-  restricted_features = [
-    "dynamic_offers",
-    "services",
-  ]
+  restricted_features = [ "dynamic_offers" ]
   manifest_deps = [ ":realm.cml" ]
 }
 
diff --git a/src/ui/input/drivers/hid-input-report/BUILD.gn b/src/ui/input/drivers/hid-input-report/BUILD.gn
index 2c92c13..ca870343 100644
--- a/src/ui/input/drivers/hid-input-report/BUILD.gn
+++ b/src/ui/input/drivers/hid-input-report/BUILD.gn
@@ -92,7 +92,6 @@
   manifest = "meta/hid-input-report.cml"
   deps = [ ":hid-input-report-driver-v2" ]
   info = "hid-input-report-info.json"
-  restricted_features = [ "services" ]
 }
 
 test("hid-input-report-test-bin") {
diff --git a/tools/cmc/BUILD.gn b/tools/cmc/BUILD.gn
index 75eacc8..c3a5c3e 100644
--- a/tools/cmc/BUILD.gn
+++ b/tools/cmc/BUILD.gn
@@ -97,7 +97,6 @@
 fuchsia_component_manifest("example_component_manifest") {
   testonly = true
   restricted_features = [
-    "services",
     "dynamic_offers",
     "allow_long_names",
   ]
diff --git a/tools/cmc/build/restricted_features/BUILD.gn b/tools/cmc/build/restricted_features/BUILD.gn
index 549bc6e..cc4a408 100644
--- a/tools/cmc/build/restricted_features/BUILD.gn
+++ b/tools/cmc/build/restricted_features/BUILD.gn
@@ -2,12 +2,6 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-# The allowlist of components that can use the "services" feature in CML.
-group("services") {
-  # This allowlist is empty as all drivers are using services.
-  # This group still exists because a component has to manually opt-in to services.
-}
-
 # The allowlist of components that can use the "dynamic_offers" feature in CML.
 group("dynamic_offers") {
   visibility = [
diff --git a/tools/cmc/src/compile.rs b/tools/cmc/src/compile.rs
index b14a0a8..832f8dc2 100644
--- a/tools/cmc/src/compile.rs
+++ b/tools/cmc/src/compile.rs
@@ -170,7 +170,7 @@
         fdecl::Component::EMPTY
     }
 
-    test_compile_with_features! { FeatureSet::from(vec![Feature::Services]), {
+    test_compile_with_features! { FeatureSet::from(vec![]), {
         test_compile_service_capabilities => {
             input = json!({
                 "capabilities": [
diff --git a/tools/cmc/src/features.rs b/tools/cmc/src/features.rs
index ef2fe9cc..e939dda 100644
--- a/tools/cmc/src/features.rs
+++ b/tools/cmc/src/features.rs
@@ -40,9 +40,6 @@
 /// A feature that can be enabled/opt-into.
 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
 pub enum Feature {
-    /// Enables unified services support in CML.
-    Services,
-
     /// Allows `ComponentDecl.allowed_offers` to be specified in CML.
     DynamicOffers,
 
@@ -60,7 +57,6 @@
     type Err = String;
     fn from_str(s: &str) -> Result<Self, Self::Err> {
         match s {
-            "services" => Ok(Feature::Services),
             "dynamic_offers" => Ok(Feature::DynamicOffers),
             "structured_config" => Ok(Feature::StructuredConfig),
             "hub" => Ok(Feature::Hub),
@@ -73,7 +69,6 @@
 impl fmt::Display for Feature {
     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
         f.write_str(match self {
-            Feature::Services => "services",
             Feature::DynamicOffers => "dynamic_offers",
             Feature::StructuredConfig => "structured_config",
             Feature::Hub => "hub",
@@ -88,7 +83,6 @@
 
     #[test]
     fn feature_is_parsed() {
-        assert_eq!(Feature::Services, "services".parse::<Feature>().unwrap());
         assert_eq!(Feature::DynamicOffers, "dynamic_offers".parse::<Feature>().unwrap());
         assert_eq!(Feature::StructuredConfig, "structured_config".parse::<Feature>().unwrap());
         assert_eq!(Feature::Hub, "hub".parse::<Feature>().unwrap());
@@ -97,7 +91,6 @@
 
     #[test]
     fn feature_is_printed() {
-        assert_eq!("services", Feature::Services.to_string());
         assert_eq!("dynamic_offers", Feature::DynamicOffers.to_string());
         assert_eq!("structured_config", Feature::StructuredConfig.to_string());
         assert_eq!("hub", Feature::Hub.to_string());
@@ -107,18 +100,18 @@
     #[test]
     fn feature_set_has() {
         let set = FeatureSet::empty();
-        assert!(!set.has(&Feature::Services));
+        assert!(!set.has(&Feature::DynamicOffers));
 
-        let set = FeatureSet::from(vec![Feature::Services]);
-        assert!(set.has(&Feature::Services));
+        let set = FeatureSet::from(vec![Feature::DynamicOffers]);
+        assert!(set.has(&Feature::DynamicOffers));
     }
 
     #[test]
     fn feature_set_check() {
         let set = FeatureSet::empty();
-        assert_matches!(set.check(Feature::Services), Err(Error::RestrictedFeature(f)) if f == "services");
+        assert_matches!(set.check(Feature::DynamicOffers), Err(Error::RestrictedFeature(f)) if f == "dynamic_offers");
 
-        let set = FeatureSet::from(vec![Feature::Services]);
-        assert_matches!(set.check(Feature::Services), Ok(()));
+        let set = FeatureSet::from(vec![Feature::DynamicOffers]);
+        assert_matches!(set.check(Feature::DynamicOffers), Ok(()));
     }
 }
diff --git a/tools/cmc/src/validate.rs b/tools/cmc/src/validate.rs
index e7b1f92..343641e3 100644
--- a/tools/cmc/src/validate.rs
+++ b/tools/cmc/src/validate.rs
@@ -345,9 +345,6 @@
         capability: &'a cml::Capability,
         used_ids: &mut HashMap<String, cml::CapabilityId>,
     ) -> Result<(), Error> {
-        if capability.service.is_some() {
-            self.features.check(Feature::Services)?;
-        }
         if capability.directory.is_some() && capability.path.is_none() {
             return Err(Error::validate("\"path\" should be present with \"directory\""));
         }
@@ -407,7 +404,6 @@
         strong_dependencies: &mut DirectedGraph<DependencyNode<'a>>,
     ) -> Result<(), Error> {
         if use_.service.is_some() {
-            self.features.check(Feature::Services)?;
             if use_.r#as.is_some() {
                 return Err(Error::validate("\"as\" cannot be used with \"service\""));
             }
@@ -601,7 +597,6 @@
 
         // Ensure that services exposed from self are defined in `capabilities`.
         if let Some(service) = expose.service.as_ref() {
-            self.features.check(Feature::Services)?;
             for service in service {
                 if expose.from.iter().any(|r| *r == cml::ExposeFromRef::Self_) {
                     if !self.all_services.contains(service) {
@@ -752,7 +747,6 @@
 
         // Ensure that services offered from self are defined in `services`.
         if let Some(service) = offer.service.as_ref() {
-            self.features.check(Feature::Services)?;
             for service in service {
                 if offer.from.iter().any(|r| *r == cml::OfferFromRef::Self_) {
                     if !self.all_services.contains(service) {
@@ -5329,8 +5323,8 @@
         ),
     }
 
-    // Tests the use of services when the "services" feature is set.
-    test_validate_cml_with_feature! { FeatureSet::from(vec![Feature::Services]), {
+    // Tests for services.
+    test_validate_cml! {
         test_cml_validate_use_service(
             json!({
                 "use": [
@@ -5569,55 +5563,6 @@
             }),
             Ok(())
         ),
-    }}
-
-    // Tests that the use of services fail when the "services" feature is not set.
-    test_validate_cml! {
-        test_cml_use_service_without_feature(
-            json!({
-                "use": [
-                    { "service": "my.service.Service" },
-                ],
-            }),
-            Err(Error::RestrictedFeature(s)) if s == "services"
-        ),
-        test_cml_offer_service_without_feature(
-            json!({
-                "offer": [
-                    {
-                        "service": "my.service.Service",
-                        "from": "parent",
-                        "to": [ "#child" ],
-                    },
-                ],
-                "children": [
-                    { "name": "child", "url": "fuchsia-pkg://child" }
-                ],
-            }),
-            Err(Error::RestrictedFeature(s)) if s == "services"
-        ),
-        test_cml_expose_service_without_feature(
-            json!({
-                "expose": [
-                    {
-                        "service": "my.service.Service",
-                        "from": "#child",
-                    },
-                ],
-                "children": [
-                    { "name": "child", "url": "fuchsia-pkg://child" }
-                ],
-            }),
-            Err(Error::RestrictedFeature(s)) if s == "services"
-        ),
-        test_cml_capability_service_without_feature(
-            json!({
-                "capabilities": [
-                    { "service": "my.service.Service" },
-                ]
-            }),
-            Err(Error::RestrictedFeature(s)) if s == "services"
-        ),
     }
 
     // Tests structured config when the feature is enabled