Skip to content

Commit d0f5c86

Browse files
authored
Cadl automation pipeline (Azure#26912)
* cdoe * fix * code * fix * code * meta.json * meta.json * compatible
1 parent ae62200 commit d0f5c86

File tree

2 files changed

+77
-23
lines changed

2 files changed

+77
-23
lines changed

tools/azure-sdk-tools/packaging_tools/generate_utils.py

Lines changed: 60 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
from azure_devtools.ci_tools.git_tools import get_add_diff_file_list
88
from pathlib import Path
9-
from subprocess import check_call
9+
from subprocess import check_call, getoutput
1010
from typing import List, Dict, Any
1111
from glob import glob
1212
import yaml
@@ -52,26 +52,32 @@ def init_new_service(package_name, folder_name):
5252

5353
def update_servicemetadata(sdk_folder, data, config, folder_name, package_name, spec_folder, input_readme):
5454

55-
readme_file = str(Path(spec_folder, input_readme))
56-
global_conf = config["meta"]
57-
local_conf = config.get("projects", {}).get(readme_file, {})
58-
59-
if "resource-manager" in input_readme:
60-
cmd = ["autorest", input_readme]
61-
else:
62-
# autorest for DPG will be executed in package folder like: sdk/deviceupdate/azure-iot-deviceupdate/swagger
63-
cmd = ["autorest", _DPG_README]
64-
cmd += build_autorest_options(global_conf, local_conf)
65-
66-
# metadata
6755
metadata = {
68-
"autorest": global_conf["autorest_options"]["version"],
69-
"use": global_conf["autorest_options"]["use"],
7056
"commit": data["headSha"],
7157
"repository_url": data["repoHttpsUrl"],
72-
"autorest_command": " ".join(cmd),
73-
"readme": input_readme,
7458
}
59+
if "meta" in config:
60+
readme_file = str(Path(spec_folder, input_readme))
61+
global_conf = config["meta"]
62+
local_conf = config.get("projects", {}).get(readme_file, {})
63+
64+
if "resource-manager" in input_readme:
65+
cmd = ["autorest", input_readme]
66+
else:
67+
# autorest for DPG will be executed in package folder like: sdk/deviceupdate/azure-iot-deviceupdate/swagger
68+
cmd = ["autorest", _DPG_README]
69+
cmd += build_autorest_options(global_conf, local_conf)
70+
71+
# metadata
72+
metadata.update({
73+
"autorest": global_conf["autorest_options"]["version"],
74+
"use": global_conf["autorest_options"]["use"],
75+
"autorest_command": " ".join(cmd),
76+
"readme": input_readme,
77+
})
78+
else:
79+
metadata["cadl_src"] = input_readme
80+
metadata.update(config)
7581

7682
_LOGGER.info("Metadata json:\n {}".format(json.dumps(metadata, indent=2)))
7783

@@ -322,3 +328,40 @@ def format_samples(sdk_code_path) -> None:
322328
fw.write(file_content)
323329

324330
_LOGGER.info(f"format generated_samples successfully")
331+
332+
def gen_cadl(cadl_relative_path: str, spec_folder: str) -> Dict[str, Any]:
333+
# update config file
334+
cadl_python = "@azure-tools/cadl-python"
335+
project_yaml_path = Path(spec_folder) / cadl_relative_path / "cadl-project.yaml"
336+
with open(project_yaml_path, "r") as file_in:
337+
project_yaml = yaml.safe_load(file_in)
338+
if not project_yaml.get("emitters", {}).get(cadl_python):
339+
return
340+
if not project_yaml["emitters"][cadl_python].get("sdk-folder"):
341+
raise Exception("no sdk-folder is defined")
342+
output_path = Path(os.getcwd()) / project_yaml["emitters"][cadl_python]["sdk-folder"]
343+
if not output_path.exists():
344+
os.makedirs(output_path)
345+
346+
project_yaml["emitters"][cadl_python].pop("sdk-folder")
347+
project_yaml["emitters"][cadl_python]["output-path"] = str(output_path)
348+
with open(project_yaml_path, "w") as file_out:
349+
yaml.safe_dump(project_yaml, file_out)
350+
351+
# npm install tool
352+
origin_path = os.getcwd()
353+
os.chdir(Path(spec_folder) / cadl_relative_path)
354+
check_call("npm install", shell=True)
355+
356+
# generate code
357+
check_call(f"npx cadl compile . --emit {cadl_python}", shell=True)
358+
if Path(output_path / "output.yaml").exists():
359+
os.remove(Path(output_path / "output.yaml"))
360+
361+
# get version of @azure-tools/cadl-python used in generation
362+
cadl_python_version = getoutput(f"npm view {cadl_python} version").split('\n')[-1]
363+
364+
# return to original folder
365+
os.chdir(origin_path)
366+
367+
return {cadl_python: cadl_python_version}

tools/azure-sdk-tools/packaging_tools/sdk_generator.py

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
format_samples,
1717
gen_dpg,
1818
dpg_relative_folder,
19+
gen_cadl
1920
)
2021

2122
_LOGGER = logging.getLogger(__name__)
@@ -30,20 +31,28 @@ def main(generate_input, generate_output):
3031
result = {}
3132
python_tag = data.get("python_tag")
3233
package_total = set()
34+
spec_word = "readmeMd"
3335
if "relatedReadmeMdFiles" in data:
3436
readme_files = data["relatedReadmeMdFiles"]
35-
else:
37+
elif "relatedReadmeMdFile" in data:
3638
input_readme = data["relatedReadmeMdFile"]
3739
if "specification" in spec_folder:
3840
spec_folder = str(Path(spec_folder.split("specification")[0]))
3941
if "specification" not in input_readme:
4042
input_readme = str(Path("specification") / input_readme)
4143
readme_files = [input_readme]
44+
else:
45+
# ["specification/confidentialledger/ConfientialLedger"]
46+
if isinstance(data["relatedCadlProjectFolder"], str):
47+
readme_files = [data["relatedCadlProjectFolder"]]
48+
else:
49+
readme_files = data["relatedCadlProjectFolder"]
50+
spec_word = "cadlProject"
4251

4352
for input_readme in readme_files:
44-
relative_path_readme = str(Path(spec_folder, input_readme))
4553
_LOGGER.info(f"[CODEGEN]({input_readme})codegen begin")
4654
if "resource-manager" in input_readme:
55+
relative_path_readme = str(Path(spec_folder, input_readme))
4756
config = generate(
4857
CONFIG_FILE,
4958
sdk_folder,
@@ -53,8 +62,10 @@ def main(generate_input, generate_output):
5362
force_generation=True,
5463
python_tag=python_tag,
5564
)
56-
else:
65+
elif "data-plane" in input_readme:
5766
config = gen_dpg(input_readme, data.get("autorestConfig", ""), dpg_relative_folder(spec_folder))
67+
else:
68+
config = gen_cadl(input_readme, spec_folder)
5869
package_names = get_package_names(sdk_folder)
5970
_LOGGER.info(f"[CODEGEN]({input_readme})codegen end. [(packages:{str(package_names)})]")
6071

@@ -68,12 +79,12 @@ def main(generate_input, generate_output):
6879
package_entry = {}
6980
package_entry["packageName"] = package_name
7081
package_entry["path"] = [folder_name]
71-
package_entry["readmeMd"] = [input_readme]
82+
package_entry[spec_word] = [input_readme]
7283
package_entry["tagIsStable"] = not judge_tag_preview(sdk_code_path)
7384
result[package_name] = package_entry
7485
else:
7586
result[package_name]["path"].append(folder_name)
76-
result[package_name]["readmeMd"].append(input_readme)
87+
result[package_name][spec_word].append(input_readme)
7788

7889
# Generate some necessary file for new service
7990
init_new_service(package_name, folder_name)
@@ -102,7 +113,7 @@ def main(generate_input, generate_output):
102113
# remove duplicates
103114
for value in result.values():
104115
value["path"] = list(set(value["path"]))
105-
value["readmeMd"] = list(set(value["readmeMd"]))
116+
value[spec_word] = list(set(value[spec_word]))
106117

107118
with open(generate_output, "w") as writer:
108119
json.dump(result, writer)

0 commit comments

Comments
 (0)