Repository: softlayer/softlayer-python

Issue:
Get image detail returns 500 after version 6.0.2
> Reminder: No username or APIkeys should be added to these issues, as they are public.


**Describe the bug**
A clear and concise description of what the bug is.  Include the command you used, make sure to include the `-v` flag, as that information is very helpful. Ex: `slcli -v vs list`

Trying to list an image returns `SoftLayerAPIError(500): Property 'note' has already been defined.`

```
slcli -vvv image detail 0af8d311-621d-4dba-a48f-562a2fe8c28b
Calling: SoftLayer_Virtual_Guest_Block_Device_Template_Group::getObject(id=0af8d311-621d-4dba-a48f-562a2fe8c28b, mask='id,createDate,note,accountId,name,globalIdentifier,parentId,publicFlag,flexImageFlag,imageType,children[blockDevices[diskImage[softwareReferences[softwareDescription]]]],firstChild,children[id,blockDevicesDiskSpaceTotal,datacenter,transaction[transactionGroup,transactionStatus],blockDevices[diskImage[capacity,name,units,softwareReferences[softwareDescription]],diskSpace]],note,createDate,status,transaction,accountReferences', filter='None', args=(), limit=None, offset=None)
Starting new HTTPS connection (1): api.softlayer.com:443
https://api.softlayer.com:443 "GET /rest/v3.1/SoftLayer_Virtual_Guest_Block_Device_Template_Group/0af8d311-621d-4dba-a48f-562a2fe8c28b/getObject.json?objectMask=mask%5Bid%2CcreateDate%2Cnote%2CaccountId%2Cname%2CglobalIdentifier%2CparentId%2CpublicFlag%2CflexImageFlag%2CimageType%2Cchildren%5BblockDevices%5BdiskImage%5BsoftwareReferences%5BsoftwareDescription%5D%5D%5D%5D%2CfirstChild%2Cchildren%5Bid%2CblockDevicesDiskSpaceTotal%2Cdatacenter%2Ctransaction%5BtransactionGroup%2CtransactionStatus%5D%2CblockDevices%5BdiskImage%5Bcapacity%2Cname%2Cunits%2CsoftwareReferences%5BsoftwareDescription%5D%5D%2CdiskSpace%5D%5D%2Cnote%2CcreateDate%2Cstatus%2Ctransaction%2CaccountReferences%5D HTTP/1.1" 500 104
Returned Data: 
null
curl -u $SL_USER:$SL_APIKEY -X GET -H "Accept: */*" -H "Accept-Encoding: gzip, deflate, compress"  'https://api.softlayer.com/rest/v3.1/SoftLayer_Virtual_Guest_Block_Device_Template_Group/0af8d311-621d-4dba-a48f-562a2fe8c28b/getObject.json?objectMask=mask%5Bid%2CcreateDate%2Cnote%2CaccountId%2Cname%2CglobalIdentifier%2CparentId%2CpublicFlag%2CflexImageFlag%2CimageType%2Cchildren%5BblockDevices%5BdiskImage%5BsoftwareReferences%5BsoftwareDescription%5D%5D%5D%5D%2CfirstChild%2Cchildren%5Bid%2CblockDevicesDiskSpaceTotal%2Cdatacenter%2Ctransaction%5BtransactionGroup%2CtransactionStatus%5D%2CblockDevices%5BdiskImage%5Bcapacity%2Cname%2Cunits%2CsoftwareReferences%5BsoftwareDescription%5D%5D%2CdiskSpace%5D%5D%2Cnote%2CcreateDate%2Cstatus%2Ctransaction%2CaccountReferences%5D'
SoftLayerAPIError(500): Property 'note' has already been defined.
```

**Expected behavior**
A clear and concise description of what you expected to happen.

I expect to be able to list the image. 
If I downgrade my `slcli` to `6.0.2` I am able to list this image with no issues. 

**Screenshots**
If applicable, add screenshots to help explain your problem.

**Version**
Include the output of `slcli --version`

```
slcli --version
Current: slcli (SoftLayer Command-line) v6.1.8
Latest:  slcli (SoftLayer Command-line) v6.1.8
```


Discussion:

Patch:
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
index adc5408b..19d4bd81 100644
--- a/.github/workflows/codeql-analysis.yml
+++ b/.github/workflows/codeql-analysis.yml
@@ -39,11 +39,11 @@ jobs:
 
     steps:
     - name: Checkout repository
-      uses: actions/checkout@v4
+      uses: actions/checkout@v2
 
     # Initializes the CodeQL tools for scanning.
     - name: Initialize CodeQL
-      uses: github/codeql-action/init@v2
+      uses: github/codeql-action/init@v1
       with:
         languages: ${{ matrix.language }}
         # If you wish to specify custom queries, you can do so here or in a config file.
@@ -54,7 +54,7 @@ jobs:
     # Autobuild attempts to build any compiled languages  (C/C++, C#, or Java).
     # If this step fails, then you should remove it and run the build manually (see below)
     - name: Autobuild
-      uses: github/codeql-action/autobuild@v2
+      uses: github/codeql-action/autobuild@v1
 
     # ℹ️ Command-line programs to run using the OS shell.
     # 📚 https://git.io/JvXDl
@@ -68,4 +68,4 @@ jobs:
     #   make release
 
     - name: Perform CodeQL Analysis
-      uses: github/codeql-action/analyze@v2
+      uses: github/codeql-action/analyze@v1
diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml
index f0935473..d307fd93 100644
--- a/.github/workflows/documentation.yml
+++ b/.github/workflows/documentation.yml
@@ -10,12 +10,12 @@ jobs:
     runs-on: ubuntu-latest
     strategy:
       matrix:
-        python-version: [3.11]
+        python-version: [3.8]
 
     steps:
-    - uses: actions/checkout@v4
+    - uses: actions/checkout@v2
     - name: Set up Python ${{ matrix.python-version }}
-      uses: actions/setup-python@v4
+      uses: actions/setup-python@v1
       with:
         python-version: ${{ matrix.python-version }}
     - name: Install dependencies
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 95afeced..f307200d 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -1,6 +1,3 @@
-# https://packaging.python.org/guides/publishing-package-distribution-releases-using-github-actions-ci-cd-workflows/
-# Trusted Publisher stuff: https://docs.pypi.org/trusted-publishers/adding-a-publisher/
-
 name: Release to PyPi
 
 on:
@@ -11,17 +8,12 @@ jobs:
   build-n-publish:
     name: Build and publish Python 🐍 distributions 📦 to PyPI and TestPyPI
     runs-on: ubuntu-latest
-    environment:
-      name: pypi
-      url: https://pypi.org/project/SoftLayer/
-    permissions:
-      id-token: write
     steps:
-    - uses: actions/checkout@v4
-    - name: Set up Python 3.11
-      uses: actions/setup-python@v4
+    - uses: actions/checkout@master
+    - name: Set up Python 3.8
+      uses: actions/setup-python@v2
       with:
-        python-version: 3.11
+        python-version: 3.8
     - name: Install pypa/build
       run: >-
         python -m
@@ -36,6 +28,10 @@ jobs:
         --wheel
         --outdir dist/
         .
-    - name: 📦 to PyPI
+    - name: Publish 📦 to Test PyPI
       uses: pypa/gh-action-pypi-publish@release/v1
+      with:
+        user: __token__
+        password: ${{ secrets.CGALLO_PYPI }}
+        repository_url: https://upload.pypi.org/legacy/
 
diff --git a/SoftLayer/CLI/file/cancel.py b/SoftLayer/CLI/file/cancel.py
index 9837f9fa..34077fbb 100644
--- a/SoftLayer/CLI/file/cancel.py
+++ b/SoftLayer/CLI/file/cancel.py
@@ -16,21 +16,14 @@
               is_flag=True,
               help="Cancels the file storage volume immediately instead "
                    "of on the billing anniversary")
-@click.option('--force', default=False, is_flag=True, help="Force modify")
 @environment.pass_env
-def cli(env, volume_id, reason, immediate, force):
-    """Cancel an existing file storage volume.
-
-    EXAMPLE::
-        slcli file volume-cancel 12345678 --immediate -f
-        This command cancels volume with ID 12345678 immediately and without asking for confirmation.
-    """
+def cli(env, volume_id, reason, immediate):
+    """Cancel an existing file storage volume."""
 
     file_storage_manager = SoftLayer.FileStorageManager(env.client)
 
-    if not force:
-        if not (env.skip_confirmations or formatting.no_going_back(volume_id)):
-            raise exceptions.CLIAbort('Aborted.')
+    if not (env.skip_confirmations or formatting.no_going_back(volume_id)):
+        raise exceptions.CLIAbort('Aborted')
 
     cancelled = file_storage_manager.cancel_file_volume(volume_id,
                                                         reason, immediate)
diff --git a/SoftLayer/CLI/file/duplicate.py b/SoftLayer/CLI/file/duplicate.py
index 50c7c6ea..b8b5983b 100644
--- a/SoftLayer/CLI/file/duplicate.py
+++ b/SoftLayer/CLI/file/duplicate.py
@@ -5,7 +5,6 @@
 import SoftLayer
 from SoftLayer.CLI import environment
 from SoftLayer.CLI import exceptions
-from SoftLayer.CLI import formatting
 
 
 CONTEXT_SETTINGS = {'token_normalize_func': lambda x: x.upper()}
@@ -59,17 +58,11 @@
               show_default=True,
               help='Whether or not this duplicate will be a dependent duplicate'
                    'of the origin volume.')
-@click.option('--force', default=False, is_flag=True, help="Force modify")
 @environment.pass_env
 def cli(env, origin_volume_id, origin_snapshot_id, duplicate_size,
         duplicate_iops, duplicate_tier, duplicate_snapshot_size, billing,
-        dependent_duplicate, force):
-    """Order a duplicate file storage volume.
-
-    EXAMPLE::
-        slcli file volume-duplicate 12345678
-        This command shows order a new volume by duplicating the volume with ID 12345678.
-    """
+        dependent_duplicate):
+    """Order a duplicate file storage volume."""
     file_manager = SoftLayer.FileStorageManager(env.client)
 
     hourly_billing_flag = False
@@ -79,11 +72,6 @@ def cli(env, origin_volume_id, origin_snapshot_id, duplicate_size,
     if duplicate_tier is not None:
         duplicate_tier = float(duplicate_tier)
 
-    if not force:
-        if not (env.skip_confirmations or formatting.confirm("This action will incur charges on your account."
-                                                             "Continue?")):
-            raise exceptions.CLIAbort('Aborted.')
-
     try:
         order = file_manager.order_duplicate_volume(
             origin_volume_id,
diff --git a/SoftLayer/CLI/file/limit.py b/SoftLayer/CLI/file/limit.py
index 1437578c..e0243ddc 100644
--- a/SoftLayer/CLI/file/limit.py
+++ b/SoftLayer/CLI/file/limit.py
@@ -18,12 +18,7 @@
 @click.option('--datacenter', '-d', help='Filter by datacenter')
 @environment.pass_env
 def cli(env, sortby, datacenter):
-    """List number of block storage volumes limit per datacenter.
-
-    EXAMPLE:
-        slcli file volume-limits
-        This command lists the storage limits per datacenter for this account.
-    """
+    """List number of block storage volumes limit per datacenter."""
     file_manager = SoftLayer.FileStorageManager(env.client)
     file_volumes = file_manager.list_file_volume_limit()
 
diff --git a/SoftLayer/CLI/image/__init__.py b/SoftLayer/CLI/image/__init__.py
index d53152d0..14a4dc5f 100644
--- a/SoftLayer/CLI/image/__init__.py
+++ b/SoftLayer/CLI/image/__init__.py
@@ -5,9 +5,10 @@
 
 MASK = ('id,createDate,note,accountId,name,globalIdentifier,parentId,publicFlag,flexImageFlag,'
         'imageType,children[blockDevices[diskImage[softwareReferences[softwareDescription]]]]')
-DETAIL_MASK = MASK + (',firstChild,children[id,blockDevicesDiskSpaceTotal,datacenter,'
-                      'transaction[transactionGroup,transactionStatus],'
-                      'blockDevices[diskImage[capacity,name,units,softwareReferences[softwareDescription]],diskSpace]],'
-                      'note,createDate,status,transaction,accountReferences')
+DETAIL_MASK = ('id,createDate,note,accountId,name,globalIdentifier,parentId,publicFlag,flexImageFlag,'
+               'imageType,firstChild,children[id,blockDevicesDiskSpaceTotal,datacenter,'
+               'transaction[transactionGroup,transactionStatus],'
+               'blockDevices[diskImage[capacity,name,units,softwareReferences[softwareDescription]],diskSpace]],'
+               'status,transaction,accountReferences')
 PUBLIC_TYPE = formatting.FormattedItem('PUBLIC', 'Public')
 PRIVATE_TYPE = formatting.FormattedItem('PRIVATE', 'Private')


Test patch:
diff --git a/.github/workflows/test_pypi_release.yml b/.github/workflows/test_pypi_release.yml
index 70245307..12443d25 100644
--- a/.github/workflows/test_pypi_release.yml
+++ b/.github/workflows/test_pypi_release.yml
@@ -1,27 +1,21 @@
 # https://packaging.python.org/guides/publishing-package-distribution-releases-using-github-actions-ci-cd-workflows/
-# Trusted Publisher stuff: https://docs.pypi.org/trusted-publishers/adding-a-publisher/
 
-name: TEST Publish 📦 to TestPyPI
+name: Publish 📦 to TestPyPI
 
 on:
   push:
-    branches: [test-pypi]
+    branches: [test-pypi ]
 
 jobs:
   build-n-publish:
-    name: TEST Build and publish Python 🐍 distributions 📦 to PyPI and TestPyPI
+    name: Build and publish Python 🐍 distributions 📦 to PyPI and TestPyPI
     runs-on: ubuntu-latest
-    environment:
-      name: pypi-test
-      url: https://test.pypi.org/project/SoftLayer/
-    permissions:
-      id-token: write
     steps:
     - uses: actions/checkout@master
-    - name: Set up Python 3.11
-      uses: actions/setup-python@v4
+    - name: Set up Python 3.8
+      uses: actions/setup-python@v2
       with:
-        python-version: 3.11
+        python-version: 3.8
     - name: Install pypa/build
       run: >-
         python -m
@@ -37,6 +31,7 @@ jobs:
         --outdir dist/
         .
     - name: Publish 📦 to Test PyPI
-      uses: pypa/gh-action-pypi-publish@release/v1
+      uses: pypa/gh-action-pypi-publish@master
       with:
-        repository-url: https://test.pypi.org/legacy/
+        password: ${{ secrets.CGALLO_TEST_PYPI }}
+        repository_url: https://test.pypi.org/legacy/
\ No newline at end of file
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index 9b079350..a9827899 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -13,9 +13,9 @@ jobs:
         python-version: [3.7,3.8,3.9,'3.10',3.11]
 
     steps:
-    - uses: actions/checkout@v4
+    - uses: actions/checkout@v2
     - name: Set up Python ${{ matrix.python-version }}
-      uses: actions/setup-python@v4
+      uses: actions/setup-python@v1
       with:
         python-version: ${{ matrix.python-version }}
     - name: Install dependencies
@@ -27,9 +27,9 @@ jobs:
   coverage:
     runs-on: ubuntu-latest
     steps:
-    - uses: actions/checkout@v4
+    - uses: actions/checkout@v2
     - name: Set up Python
-      uses: actions/setup-python@v4
+      uses: actions/setup-python@v1
       with:
         python-version: 3.9
     - name: Install dependencies
@@ -41,9 +41,9 @@ jobs:
   analysis:
     runs-on: ubuntu-latest
     steps:
-    - uses: actions/checkout@v4
+    - uses: actions/checkout@v2
     - name: Set up Python
-      uses: actions/setup-python@v4
+      uses: actions/setup-python@v1
       with:
         python-version: 3.9
     - name: Install dependencies
diff --git a/tests/CLI/modules/file_tests.py b/tests/CLI/modules/file_tests.py
index 5aafbbee..a1749e7f 100644
--- a/tests/CLI/modules/file_tests.py
+++ b/tests/CLI/modules/file_tests.py
@@ -850,17 +850,3 @@ def test_file_snapshot_cancel_force(self, confirm_mock):
         result = self.run_command(['file', 'snapshot-cancel', '4917309'])
         self.assertEqual(2, result.exit_code)
         self.assertEqual('Aborted.', result.exception.message)
-
-    @mock.patch('SoftLayer.CLI.formatting.confirm')
-    def test_file_volume_cancel_force(self, confirm_mock):
-        confirm_mock.return_value = False
-        result = self.run_command(['file', 'volume-cancel', '1234'])
-        self.assertEqual(2, result.exit_code)
-        self.assertEqual('Aborted.', result.exception.message)
-
-    @mock.patch('SoftLayer.CLI.formatting.confirm')
-    def test_file_volume_duplicate_force(self, confirm_mock):
-        confirm_mock.return_value = False
-        result = self.run_command(['file', 'volume-duplicate', '100'])
-        self.assertEqual(2, result.exit_code)
-        self.assertEqual('Aborted.', result.exception.message)