Is there a way to programmatically change all services on a server to shared from dedicated?

879
3
Jump to solution
08-12-2021 08:29 AM
by Anonymous User
Not applicable

ArcGIS server 10.8.1

I have well over 200 services in my testing environment.  I would like to change them all to shared.  Is there a way using notebook?

Tags (2)
0 Kudos
1 Solution

Accepted Solutions
JakeSkinner
Esri Esteemed Contributor

@Anonymous User Yes, you will need to iterate through each service, check if it's dedicated, and then update the provider if it is using the ChangeProvider operation.  Ex:

 

import requests, json

# Variables
username = 'siteadmin'
password = 'siteadmin'
server = "ags.esri.com"

# Disable warnings
requests.packages.urllib3.disable_warnings()

# Function to change provider
def changeProvider():
    print("\tChanging provider")
    url = serviceURL + '/changeProvider'
    params = {'f': 'pjson', 'token': token, 'provider': 'DMaps'}
    r = requests.post(url, data=params, verify=False)
    response = json.loads(r.content)
    print(f"\t{response['status']}")

# Generate ArcGIS Server Token
tokenURL = f'https://{server}:6443/arcgis/admin/generateToken'
params = {'f': 'pjson', 'username': username, 'password': password, 'client': 'requestip'}
r = requests.post(tokenURL, data=params, verify=False)
response = json.loads(r.content)
token = response['token']

# Query AGS service propoerties in ROOT
baseUrl = f'https://{server}:6443/arcgis/admin/services'
params = {'f': 'pjson', 'token': token}
r = requests.post(baseUrl, data=params, verify=False)
catalog = json.loads(r.content)
services = catalog['services']
for service in services:
    if service['type']!= 'StreamServer' and service['type'] != 'GPServer':
        params = {'f': 'pjson', 'token': token}
        serviceURL = f"{baseUrl}/{service['serviceName']}.{service['type']}"
        r = requests.post(serviceURL, data=params, verify=False)
        response = json.loads(r.content)
        # Check if provider is dedicated
        if response['provider'] == 'ArcObjects11':
            # Execute function to change provider
            print(f"{service['serviceName']} is dedicated")
            changeProvider()

# Query AGS service propoerties in folders
folders = catalog['folders']
for folderName in folders:
    if str(folderName) not in ('Hosted', 'System', 'Utilities', 'DataStoreCatalogs'):
        baseUrl = f'https://{server}:6443/arcgis/admin/services/{folderName}'
        params = {'f': 'pjson', 'token': token}
        r = requests.post(baseUrl, data=params, verify=False)
        catalog = json.loads(r.content)
        services = catalog['services']
        for service in services:
            if service['type'] != 'StreamServer' and service['type'] != 'GPServer':
                serviceURL = f"{baseUrl}/{service['serviceName']}.{service['type']}"
                r = requests.post(serviceURL, data=params, verify=False)
                response = json.loads(r.content)
                if response['provider'] == 'ArcObjects11':
                    # Execute function to change provider
                    print(f"{service['serviceName']} is dedicated")
                    changeProvider()

 

View solution in original post

0 Kudos
3 Replies
JakeSkinner
Esri Esteemed Contributor

Hi @Anonymous User,

You can use the Change Provider operation.

0 Kudos
by Anonymous User
Not applicable

This operation is used to update an individual service to use either a dedicated or shared instance type is right in the documentation and I see no way to do multiple.  One at at time is just as easily completed using the server manager.  Thanks

 

 

0 Kudos
JakeSkinner
Esri Esteemed Contributor

@Anonymous User Yes, you will need to iterate through each service, check if it's dedicated, and then update the provider if it is using the ChangeProvider operation.  Ex:

 

import requests, json

# Variables
username = 'siteadmin'
password = 'siteadmin'
server = "ags.esri.com"

# Disable warnings
requests.packages.urllib3.disable_warnings()

# Function to change provider
def changeProvider():
    print("\tChanging provider")
    url = serviceURL + '/changeProvider'
    params = {'f': 'pjson', 'token': token, 'provider': 'DMaps'}
    r = requests.post(url, data=params, verify=False)
    response = json.loads(r.content)
    print(f"\t{response['status']}")

# Generate ArcGIS Server Token
tokenURL = f'https://{server}:6443/arcgis/admin/generateToken'
params = {'f': 'pjson', 'username': username, 'password': password, 'client': 'requestip'}
r = requests.post(tokenURL, data=params, verify=False)
response = json.loads(r.content)
token = response['token']

# Query AGS service propoerties in ROOT
baseUrl = f'https://{server}:6443/arcgis/admin/services'
params = {'f': 'pjson', 'token': token}
r = requests.post(baseUrl, data=params, verify=False)
catalog = json.loads(r.content)
services = catalog['services']
for service in services:
    if service['type']!= 'StreamServer' and service['type'] != 'GPServer':
        params = {'f': 'pjson', 'token': token}
        serviceURL = f"{baseUrl}/{service['serviceName']}.{service['type']}"
        r = requests.post(serviceURL, data=params, verify=False)
        response = json.loads(r.content)
        # Check if provider is dedicated
        if response['provider'] == 'ArcObjects11':
            # Execute function to change provider
            print(f"{service['serviceName']} is dedicated")
            changeProvider()

# Query AGS service propoerties in folders
folders = catalog['folders']
for folderName in folders:
    if str(folderName) not in ('Hosted', 'System', 'Utilities', 'DataStoreCatalogs'):
        baseUrl = f'https://{server}:6443/arcgis/admin/services/{folderName}'
        params = {'f': 'pjson', 'token': token}
        r = requests.post(baseUrl, data=params, verify=False)
        catalog = json.loads(r.content)
        services = catalog['services']
        for service in services:
            if service['type'] != 'StreamServer' and service['type'] != 'GPServer':
                serviceURL = f"{baseUrl}/{service['serviceName']}.{service['type']}"
                r = requests.post(serviceURL, data=params, verify=False)
                response = json.loads(r.content)
                if response['provider'] == 'ArcObjects11':
                    # Execute function to change provider
                    print(f"{service['serviceName']} is dedicated")
                    changeProvider()

 

0 Kudos