Repository: docker/docker-py

Issue:
Missed rollback_config in service's create/update methods.
Hi, in [documentation](https://docker-py.readthedocs.io/en/stable/services.html) for service written that it support `rollback_config` parameter, but in `models/services.py`'s `CREATE_SERVICE_KWARGS` list doesn't contain it.
So, I got this error:
`TypeError: create() got an unexpected keyword argument 'rollback_config'`
Can someone tell me, is this done intentionally, or is it a bug?

**Version:** `4.4.4, 5.0.0 and older`

**My diff:**
```
diff --git a/docker/models/services.py b/docker/models/services.py
index a29ff13..0f26626 100644
--- a/docker/models/services.py
+++ b/docker/models/services.py
@@ -314,6 +314,7 @@ CREATE_SERVICE_KWARGS = [
     'labels',
     'mode',
     'update_config',
+    'rollback_config',
     'endpoint_spec',
 ]
```

PS. Full stacktrace:
```
In [54]: service_our = client.services.create(
    ...:     name=service_name,
    ...:     image=image_full_name,
    ...:     restart_policy=restart_policy,
    ...:     update_config=update_config,
    ...:     rollback_config=rollback_config
    ...:     )
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-54-8cc6a8a6519b> in <module>
----> 1 service_our = client.services.create(
      2     name=service_name,
      3     image=image_full_name,
      4     restart_policy=restart_policy,
      5     update_config=update_config,

/usr/local/lib/python3.9/site-packages/docker/models/services.py in create(self, image, command, **kwargs)
    224         kwargs['image'] = image
    225         kwargs['command'] = command
--> 226         create_kwargs = _get_create_service_kwargs('create', kwargs)
    227         service_id = self.client.api.create_service(**create_kwargs)
    228         return self.get(service_id)

/usr/local/lib/python3.9/site-packages/docker/models/services.py in _get_create_service_kwargs(func_name, kwargs)
    369     # All kwargs should have been consumed by this point, so raise
    370     # error if any are left
--> 371     if kwargs:
    372         raise create_unexpected_kwargs_error(func_name, kwargs)
    373

TypeError: create() got an unexpected keyword argument 'rollback_config'
```

Discussion:

Patch:
diff --git a/docker/api/plugin.py b/docker/api/plugin.py
index 57110f11..10210c1a 100644
--- a/docker/api/plugin.py
+++ b/docker/api/plugin.py
@@ -51,19 +51,20 @@ class PluginApiMixin:
         return True
 
     @utils.minimum_version('1.25')
-    def disable_plugin(self, name):
+    def disable_plugin(self, name, force=False):
         """
             Disable an installed plugin.
 
             Args:
                 name (string): The name of the plugin. The ``:latest`` tag is
                     optional, and is the default if omitted.
+                force (bool): To enable the force query parameter.
 
             Returns:
                 ``True`` if successful
         """
         url = self._url('/plugins/{0}/disable', name)
-        res = self._post(url)
+        res = self._post(url, params={'force': force})
         self._raise_for_status(res)
         return True
 
diff --git a/docker/models/plugins.py b/docker/models/plugins.py
index 69b94f35..16f5245e 100644
--- a/docker/models/plugins.py
+++ b/docker/models/plugins.py
@@ -44,16 +44,19 @@ class Plugin(Model):
         self.client.api.configure_plugin(self.name, options)
         self.reload()
 
-    def disable(self):
+    def disable(self, force=False):
         """
             Disable the plugin.
 
+            Args:
+                force (bool): Force disable. Default: False
+
             Raises:
                 :py:class:`docker.errors.APIError`
                     If the server returns an error.
         """
 
-        self.client.api.disable_plugin(self.name)
+        self.client.api.disable_plugin(self.name, force)
         self.reload()
 
     def enable(self, timeout=0):
diff --git a/docker/models/services.py b/docker/models/services.py
index 200dd333..92550681 100644
--- a/docker/models/services.py
+++ b/docker/models/services.py
@@ -320,6 +320,7 @@ CREATE_SERVICE_KWARGS = [
     'labels',
     'mode',
     'update_config',
+    'rollback_config',
     'endpoint_spec',
 ]
 


Test patch:
diff --git a/tests/integration/api_plugin_test.py b/tests/integration/api_plugin_test.py
index 38f9d12d..3ecb0283 100644
--- a/tests/integration/api_plugin_test.py
+++ b/tests/integration/api_plugin_test.py
@@ -22,13 +22,13 @@ class PluginTest(BaseAPIIntegrationTest):
     def teardown_method(self, method):
         client = self.get_client_instance()
         try:
-            client.disable_plugin(SSHFS)
+            client.disable_plugin(SSHFS, True)
         except docker.errors.APIError:
             pass
 
         for p in self.tmp_plugins:
             try:
-                client.remove_plugin(p, force=True)
+                client.remove_plugin(p)
             except docker.errors.APIError:
                 pass
 
diff --git a/tests/integration/models_services_test.py b/tests/integration/models_services_test.py
index 982842b3..f1439a41 100644
--- a/tests/integration/models_services_test.py
+++ b/tests/integration/models_services_test.py
@@ -30,13 +30,18 @@ class ServiceTest(unittest.TestCase):
             # ContainerSpec arguments
             image="alpine",
             command="sleep 300",
-            container_labels={'container': 'label'}
+            container_labels={'container': 'label'},
+            rollback_config={'order': 'start-first'}
         )
         assert service.name == name
         assert service.attrs['Spec']['Labels']['foo'] == 'bar'
         container_spec = service.attrs['Spec']['TaskTemplate']['ContainerSpec']
         assert "alpine" in container_spec['Image']
         assert container_spec['Labels'] == {'container': 'label'}
+        spec_rollback = service.attrs['Spec'].get('RollbackConfig', None)
+        assert spec_rollback is not None
+        assert ('Order' in spec_rollback and
+               spec_rollback['Order'] == 'start-first')
 
     def test_create_with_network(self):
         client = docker.from_env(version=TEST_API_VERSION)
diff --git a/tests/unit/models_services_test.py b/tests/unit/models_services_test.py
index b9192e42..94a27f0e 100644
--- a/tests/unit/models_services_test.py
+++ b/tests/unit/models_services_test.py
@@ -11,6 +11,7 @@ class CreateServiceKwargsTest(unittest.TestCase):
             'labels': {'key': 'value'},
             'hostname': 'test_host',
             'mode': 'global',
+            'rollback_config': {'rollback': 'config'},
             'update_config': {'update': 'config'},
             'networks': ['somenet'],
             'endpoint_spec': {'blah': 'blah'},
@@ -37,6 +38,7 @@ class CreateServiceKwargsTest(unittest.TestCase):
             'name': 'somename',
             'labels': {'key': 'value'},
             'mode': 'global',
+            'rollback_config': {'rollback': 'config'},
             'update_config': {'update': 'config'},
             'endpoint_spec': {'blah': 'blah'},
         }