Skip to content

Commit 3b38840

Browse files
Release 2.3.0 (#96)
# Release 2.3.0 Source: dev branch Target: main branch ## What's Changed This release was created from the dev branch and includes all merged features and fixes since the last release. ## Pre-merge Checklist - [ ] All CI/CD checks pass - [ ] Release notes reviewed - [ ] Documentation updated - [ ] Breaking changes documented (if any) ## Validation - ✓ Gap 1: No conflicting release PRs exist - ✓ Gap 3: Version collision check passed - ✓ Branch created in both AzDO and GitHub ## GitHub Actions Status Monitor workflow status: https://github.com/microsoft/edge-ai/actions
2 parents 5918632 + 6a34bbb commit 3b38840

File tree

126 files changed

+11623
-807
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

126 files changed

+11623
-807
lines changed

.cspell/azure-services.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ azmon
3636
azuredevops
3737
azuremonitor
3838
azureml
39+
cognitiveservices
3940
cosmosdb
4041
deviceregistry
4142
eastus

.cspell/general-technical.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,7 @@ devopsdays
388388
devtest
389389
diego
390390
differenced
391+
diffie
391392
dimensionality
392393
disco
393394
disks

blueprints/dual-peered-single-node-cluster/terraform/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ Each cluster operates independently but can communicate through the peered virtu
105105
| enterprise\_client\_ca\_configmap\_name | The name of the Kubernetes configmap containing the client CA certificate | `string` | `"client-ca"` | no |
106106
| external\_certificates | External certificates to use instead of generating them with Terraform. When null, certificates will be generated using the terraform-certificate-generation module. | ```object({ server_root_ca_cert = string server_root_ca_key = string server_intermediate_ca_cert = string server_intermediate_ca_key = string server_leaf_cert = string server_leaf_key = string client_root_ca_cert = string client_root_ca_key = string client_intermediate_ca_cert = string client_intermediate_ca_key = string client_leaf_cert = string client_leaf_key = string })``` | `null` | no |
107107
| instance | Instance identifier for naming resources: 001, 002, etc | `string` | `"001"` | no |
108-
| namespaced\_assets | List of namespaced assets to create. Otherwise, an empty list. | ```list(object({ name = string display_name = optional(string) device_ref = object({ device_name = string endpoint_name = string }) description = optional(string) documentation_uri = optional(string) enabled = optional(bool, true) hardware_revision = optional(string) manufacturer = optional(string) manufacturer_uri = optional(string) model = optional(string) product_code = optional(string) serial_number = optional(string) software_revision = optional(string) attributes = optional(map(string), {}) datasets = optional(list(object({ name = string data_points = list(object({ name = string data_source = string data_point_configuration = optional(string) })) destinations = optional(list(object({ target = string configuration = object({ topic = optional(string) retain = optional(string) qos = optional(string) }) })), []) })), []) default_datasets_configuration = optional(string) default_events_configuration = optional(string) }))``` | `[]` | no |
108+
| namespaced\_assets | List of namespaced assets with enhanced configuration support | ```list(object({ name = string display_name = optional(string) device_ref = optional(object({ device_name = string endpoint_name = string })) asset_endpoint_profile_ref = optional(string) default_datasets_configuration = optional(string) default_streams_configuration = optional(string) default_events_configuration = optional(string) description = optional(string) documentation_uri = optional(string) enabled = optional(bool, true) hardware_revision = optional(string) manufacturer = optional(string) manufacturer_uri = optional(string) model = optional(string) product_code = optional(string) serial_number = optional(string) software_revision = optional(string) attributes = optional(map(string), {}) datasets = optional(list(object({ name = string data_points = list(object({ data_point_configuration = optional(string) data_source = string name = string observability_mode = optional(string) rest_sampling_interval_ms = optional(number) rest_mqtt_topic = optional(string) rest_include_state_store = optional(bool) rest_state_store_key = optional(string) })) dataset_configuration = optional(string) data_source = optional(string) destinations = optional(list(object({ target = string configuration = object({ topic = optional(string) retain = optional(string) qos = optional(string) }) })), []) type_ref = optional(string) })), []) streams = optional(list(object({ name = string stream_configuration = optional(string) type_ref = optional(string) destinations = optional(list(object({ target = string configuration = object({ topic = optional(string) retain = optional(string) qos = optional(string) }) })), []) })), []) event_groups = optional(list(object({ name = string data_source = optional(string) event_group_configuration = optional(string) type_ref = optional(string) default_destinations = optional(list(object({ target = string configuration = object({ topic = optional(string) retain = optional(string) qos = optional(string) }) })), []) events = list(object({ name = string data_source = string event_configuration = optional(string) type_ref = optional(string) destinations = optional(list(object({ target = string configuration = object({ topic = optional(string) retain = optional(string) qos = optional(string) }) })), []) })) })), []) management_groups = optional(list(object({ name = string data_source = optional(string) management_group_configuration = optional(string) type_ref = optional(string) default_topic = optional(string) default_timeout_in_seconds = optional(number, 100) actions = list(object({ name = string action_type = string target_uri = string topic = optional(string) timeout_in_seconds = optional(number) action_configuration = optional(string) type_ref = optional(string) })) })), []) }))``` | `[]` | no |
109109
| namespaced\_devices | List of namespaced devices to create. Otherwise, an empty list. | ```list(object({ name = string enabled = optional(bool, true) endpoints = object({ outbound = optional(object({ assigned = object({}) }), { assigned = {} }) inbound = map(object({ endpoint_type = string address = string version = optional(string, null) additionalConfiguration = optional(string) authentication = object({ method = string usernamePasswordCredentials = optional(object({ usernameSecretName = string passwordSecretName = string })) x509Credentials = optional(object({ certificateSecretName = string })) }) trustSettings = optional(object({ trustList = string })) })) }) }))``` | `[]` | no |
110110
| nat\_gateway\_idle\_timeout\_minutes | Idle timeout in minutes for NAT gateway connections | `number` | `4` | no |
111111
| nat\_gateway\_public\_ip\_count | Number of public IP addresses to associate with the NAT gateway (example: 2) | `number` | `1` | no |

blueprints/dual-peered-single-node-cluster/terraform/variables.tf

Lines changed: 98 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -400,28 +400,39 @@ variable "namespaced_assets" {
400400
type = list(object({
401401
name = string
402402
display_name = optional(string)
403-
device_ref = object({
403+
device_ref = optional(object({
404404
device_name = string
405405
endpoint_name = string
406-
})
407-
description = optional(string)
408-
documentation_uri = optional(string)
409-
enabled = optional(bool, true)
410-
hardware_revision = optional(string)
411-
manufacturer = optional(string)
412-
manufacturer_uri = optional(string)
413-
model = optional(string)
414-
product_code = optional(string)
415-
serial_number = optional(string)
416-
software_revision = optional(string)
417-
attributes = optional(map(string), {})
406+
}))
407+
asset_endpoint_profile_ref = optional(string)
408+
default_datasets_configuration = optional(string)
409+
default_streams_configuration = optional(string)
410+
default_events_configuration = optional(string)
411+
description = optional(string)
412+
documentation_uri = optional(string)
413+
enabled = optional(bool, true)
414+
hardware_revision = optional(string)
415+
manufacturer = optional(string)
416+
manufacturer_uri = optional(string)
417+
model = optional(string)
418+
product_code = optional(string)
419+
serial_number = optional(string)
420+
software_revision = optional(string)
421+
attributes = optional(map(string), {})
418422
datasets = optional(list(object({
419423
name = string
420424
data_points = list(object({
421-
name = string
422-
data_source = string
423-
data_point_configuration = optional(string)
425+
data_point_configuration = optional(string)
426+
data_source = string
427+
name = string
428+
observability_mode = optional(string)
429+
rest_sampling_interval_ms = optional(number)
430+
rest_mqtt_topic = optional(string)
431+
rest_include_state_store = optional(bool)
432+
rest_state_store_key = optional(string)
424433
}))
434+
dataset_configuration = optional(string)
435+
data_source = optional(string)
425436
destinations = optional(list(object({
426437
target = string
427438
configuration = object({
@@ -430,12 +441,80 @@ variable "namespaced_assets" {
430441
qos = optional(string)
431442
})
432443
})), [])
444+
type_ref = optional(string)
445+
})), [])
446+
streams = optional(list(object({
447+
name = string
448+
stream_configuration = optional(string)
449+
type_ref = optional(string)
450+
destinations = optional(list(object({
451+
target = string
452+
configuration = object({
453+
topic = optional(string)
454+
retain = optional(string)
455+
qos = optional(string)
456+
})
457+
})), [])
458+
})), [])
459+
event_groups = optional(list(object({
460+
name = string
461+
data_source = optional(string)
462+
event_group_configuration = optional(string)
463+
type_ref = optional(string)
464+
default_destinations = optional(list(object({
465+
target = string
466+
configuration = object({
467+
topic = optional(string)
468+
retain = optional(string)
469+
qos = optional(string)
470+
})
471+
})), [])
472+
events = list(object({
473+
name = string
474+
data_source = string
475+
event_configuration = optional(string)
476+
type_ref = optional(string)
477+
destinations = optional(list(object({
478+
target = string
479+
configuration = object({
480+
topic = optional(string)
481+
retain = optional(string)
482+
qos = optional(string)
483+
})
484+
})), [])
485+
}))
486+
})), [])
487+
management_groups = optional(list(object({
488+
name = string
489+
data_source = optional(string)
490+
management_group_configuration = optional(string)
491+
type_ref = optional(string)
492+
default_topic = optional(string)
493+
default_timeout_in_seconds = optional(number, 100)
494+
actions = list(object({
495+
name = string
496+
action_type = string
497+
target_uri = string
498+
topic = optional(string)
499+
timeout_in_seconds = optional(number)
500+
action_configuration = optional(string)
501+
type_ref = optional(string)
502+
}))
433503
})), [])
434-
default_datasets_configuration = optional(string)
435-
default_events_configuration = optional(string)
436504
}))
437-
description = "List of namespaced assets to create. Otherwise, an empty list."
505+
description = "List of namespaced assets with enhanced configuration support"
438506
default = []
507+
508+
validation {
509+
condition = alltrue([
510+
for asset in var.namespaced_assets : alltrue([
511+
for group in coalesce(asset.management_groups, []) : alltrue([
512+
for action in group.actions : contains(["Call", "Read", "Write"], action.action_type)
513+
])
514+
])
515+
])
516+
error_message = "All management action types must be one of: Call, Read, or Write."
517+
}
439518
}
440519

441520
variable "should_create_azure_functions" {

0 commit comments

Comments
 (0)