POST
|
Hello, I have a python script that I use to publish map and image services to an ArcGIS Enterprise server for my organization, and the script involve creating an .sddraft file, modifying the XML in the .sddraft file, transforming it to a service definition file, then publishing it. I was wondering if the XML schema for the .sddraft file is documented anywhere? My modifications to the .sddraft file are based on what I find on other ESRI forum posts and documentation, but there are some settings that I don’t know how to configure since I don’t know the XML schema. Is there a better way to achieve what I am trying to do? If there’s a better approach with a simpler interface that would be wonderful. I am using ArcPro 3.0 and publishing to ArcGIS Server 10.9.1 Here is the code: import arcpy
import codecs
import getpass
import logging
import os
import sys
import shutil
import tempfile
import xml.dom.minidom as DOM
from pathlib import Path
from arcgis.gis.server import Server
ags_pw = getpass.getpass("ArcGIS server password: ")
ags_host = "https://localhost:6443"
ags_user = "admin"
project_filename = f"samples/my_example.aprx"
svc_name = "my_example"
def setText(doc, node, newText):
textnode = doc.createTextNode(newText)
node.appendChild(textnode)
tmp_sd_pth = os.path.join(os.getcwd(), "tmp.sd")
with tempfile.TemporaryDirectory() as tmp_dir:
tmp_pth = Path(tmp_dir)
sd_draft_fn = tmp_pth.joinpath("tempdraft.sddraft")
new_sd_draft = tmp_pth.joinpath("updatedDraft.sddraft")
sd = tmp_pth.joinpath(f"{svc_name}.sd")
mapdoc = arcpy.mp.ArcGISProject(project_filename)
maps = mapdoc.listMaps()
map = mapdoc.listMaps()[0]
sd_draft = arcpy.sharing.CreateSharingDraft("STANDALONE_SERVER", "MAP_SERVICE", svc_name, map)
sd_draft.offline = True
sd_draft.offlineTarget = "ENTERPRISE_10x"
sd_draft.description = "Description"
sd_draft.serverFolder = "maps"
sd_draft.overwriteExistingService = True
sd_draft.exportToSDDraft(sd_draft_fn)
doc = DOM.parse(sd_draft_fn.as_posix())
tagsType = doc.getElementsByTagName('Type')
for tagType in tagsType:
if tagType.parentNode.tagName == 'SVCManifest':
if tagType.hasChildNodes():
tagType.firstChild.data = "esriServiceDefinitionType_Replacement"
tagsState = doc.getElementsByTagName('State')
for tagState in tagsState:
if tagState.parentNode.tagName == 'SVCManifest':
if tagState.hasChildNodes():
tagState.firstChild.data = "esriSDState_Published"
# Turn off caching
configProps = doc.getElementsByTagName('ConfigurationProperties')[0]
propArray = configProps.firstChild
propSets = propArray.childNodes
for propSet in propSets:
keyValues = propSet.childNodes
for keyValue in keyValues:
if keyValue.tagName == 'Key':
if keyValue.firstChild.data == "isCached":
keyValue.nextSibling.firstChild.data = "false"
if keyValue.firstChild.data == "maxRecordCount":
keyValue.nextSibling.firstChild.data = "2000"
# Find all elements named TypeName
# This is where the extensions are defined
typeNames = doc.getElementsByTagName('TypeName')
for typeName in typeNames:
if typeName.firstChild.data == "KmlServer":
extension = typeName.parentNode
for extElement in extension.childNodes:
if extElement.tagName == 'Enabled':
extElement.firstChild.data = 'true'
if typeName.firstChild.data == "WFSServer":
extension = typeName.parentNode
for extElement in extension.childNodes:
if extElement.tagName == 'Enabled':
extElement.firstChild.data = 'true'
if typeName.firstChild.data == "WMSServer":
extension = typeName.parentNode
for extElement in extension.childNodes:
if extElement.tagName == 'Enabled':
extElement.firstChild.data = 'true'
if typeName.firstChild.data == "WCSServer":
extension = typeName.parentNode
for extElement in extension.childNodes:
if extElement.tagName == 'Enabled':
extElement.firstChild.data = 'true'
if typeName.firstChild.data == "FeatureServer":
extension = typeName.parentNode
for extElement in extension.childNodes:
if extElement.tagName == 'Enabled':
extElement.firstChild.data = 'true'
configProps = doc.getElementsByTagName('Info')[0]
propArray = configProps.firstChild
propSets = propArray.childNodes
for propSet in propSets:
keyValues = propSet.childNodes
for keyValue in keyValues:
if keyValue.tagName == 'Key':
if keyValue.firstChild.data == "WebCapabilities":
keyValue.nextSibling.firstChild.data = "Map,Data,Query"
typeNames = doc.getElementsByTagName('TypeName')
for typeName in typeNames:
if typeName.firstChild.data == "WFSServer":
extension = typeName.parentNode
for extElement in extension.childNodes:
if extElement.tagName == "Props":
for propSet in extElement.childNodes:
for prop in propSet.childNodes:
for prop1 in prop.childNodes:
if prop1.tagName == "Key":
if prop1.firstChild.data == "title":
setText(doc, prop1.nextSibling, "Example")
if prop1.firstChild.data == "abstract":
setText(doc, prop1.nextSibling, "Abstract")
if prop1.firstChild.data == "keyword":
setText(doc, prop1.nextSibling, "Keyword")
# Write to a new .sddraft file
with codecs.open(new_sd_draft, "w", "utf-8") as f:
doc.writexml(writer=f, encoding="utf-8")
logging.info("Analyzing and Staging the service...")
arcpy.server.StageService(new_sd_draft.as_posix(), sd.as_posix())
warnings = arcpy.GetMessages(1)
errors = arcpy.GetMessages(2)
if errors:
logging.error("errors found in service definition")
logging.error(errors)
sys.exit(1)
shutil.copyfile(sd, tmp_sd_pth)
server = Server(url=f"{ags_host}/arcgis/admin", token_url=f"{ags_host}/arcgis/tokens/generateToken", username=ags_user, password=ags_pw)
pr = server.publish_sd(tmp_sd_pth)
if pr:
logging.info(f"Service was successfully published")
else:
logging.error("Failed to publish service")
... View more
12-28-2022
12:52 PM
|
2
|
0
|
732
|
POST
|
I've tried doing a pg_dumpall from a postgresql 9.0 database, restoring that to a postgresql 9.5 database, but I get many errors related to parsing the geometries. I came across this thread where the poster had a similar issue to mine, and the workaround of using ArcCatalog to copy data from the old to new database seems to work without any issues. I ran into the same issue following the instructions in the links that you've posted.
... View more
05-08-2017
03:38 PM
|
0
|
0
|
516
|
POST
|
Hi, I'm looking to migrate from one enterprise geodatabase to another enterprise geodatabase (both are postgresql). I've been using ArcCatalog to do the exports, exporting a small set of tables at a time since ArcCatalog tends to freeze on large sets of data. This process has been getting tedious and I was wondering if there was a way to programmatically export geodatabases? I've checked the ArcPy documentation but there doesn't seem to be any functions that can do this. Thanks!
... View more
05-08-2017
10:59 AM
|
0
|
3
|
824
|
POST
|
Ok, so I figured out my issue. When I enabled "http and https" it looks like ArcGIS server updates a tomcat server.xml configuration (located under Server\framework\runtime\tomcat\conf) and adds a new Connector element to the file, with the secure endpoint. When I reverted the change back to "http only" my server.xml file somehow retained that connector and so http was still redirecting to https, which is what I believe was causing the issue with the PublishingTools not starting up. I removed the https connector, restarted arcgis server and the PublishingTools service was up and running again.
... View more
04-28-2017
11:18 AM
|
0
|
0
|
420
|
POST
|
Hi, I tried updating my ArcGIS server 10.1 to use SSL following the instructions here. However, I wasn't able to get that to work and I reverted the change. Now, my installation is running into an issue where I cannot publish any more services. The PublishingTools service is stopped and when I try starting it I get an "ERROR: service failed to start, No resource could be found at that address" message. I also see these messages in the logs: "Error while processing catalog request. AutomationException: null" "ServiceCatalog failed to process request. AutomationException: 0xc00cee3a" Any ideas on what's going on? Thanks!
... View more
04-28-2017
09:49 AM
|
0
|
2
|
1264
|
Title | Kudos | Posted |
---|---|---|
2 | 12-28-2022 12:52 PM |
Online Status |
Offline
|
Date Last Visited |
02-10-2023
10:15 PM
|