Add IAM leveled secondary admin/read-only group permissions hierarchy to workloads projects for tiered CI/CD

In addition to #263 add alternate admin permissions to workload projects
Opinionated groups gexample
ProdOpsAdmin group

administrator

ProdRead group

view only

ProdTelcoAdmin group

network admin
or support user
or view only

ProdSecAdmin group

view only

ProdBilling group

view only

Similar to the TEF or TOC default groups

or kcc groups https://github.com/GoogleCloudPlatform/pubsec-declarative-toolkit/blob/main/solutions/guardrails/configs/iam/group-iam.yaml

Work Items

5 groups - created in admin, console or ideally via gcloud or terraform
associate 2 or more users across the groups
assign a new user to only a read only group to test project read only access

testing gcloud
michael@cloudshell:~ (vpc-host-nonprod-hh015-gz357)$ gcloud identity groups create<EMAIL_ADDRESS>--organization="obri...re" --group-type="security" --display-name="Security Group" --description="Description of Security Group"
API [cloudresourcemanager.googleapis.com] not enabled on project [476118442898]. Would you like to enable and retry (this will take a few minutes)? (y/N)?  y

Enabling service [cloudresourcemanager.googleapis.com] on project [476118442898]...
Operation "operations/acat.p2-476118442898-57a388fd-596a-4582-aa18-6a22d8c2270f" finished successfully.
API [cloudidentity.googleapis.com] not enabled on project [476118442898]. Would you like to enable and retry (this will take a few minutes)? (y/N)?  y

Enabling service [cloudidentity.googleapis.com] on project [476118442898]...
Operation "operations/acat.p2-476118442898-2c8ba9c0-aedc-4e5c-8a63-40182b71d29c" finished successfully.
Created.

testing terraform
I expected to have to add the two services to the bootstrap project
cloudresourcemanager.googleapis.com
cloudidentity.googleapis.com
Step #4 - "tf apply": │ Error: Error creating Group: googleapi: Error 403: Cloud Identity API has not been used in project<PHONE_NUMBER>37 before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/cloudidentity.googleapis.com/overview?project=407485305437 then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.

bootstrap = {
  projectServices = [
 ...   "cloudresourcemanager.googleapis.com", # for iam group creation
    "cloudidentity.googleapis.com" # for iam group creation

rerun bootstrap cloud build job
Step #4 - "tf apply": module.landing_zone_bootstrap.module.project.google_project_service.project_services["cloudidentity.googleapis.com"]: Creation complete after 21s [id=tzpe-tlz-tlz-de/cloudidentity.googleapis.com]

root_@cloudshell:~/lz-tls/_lz2/pbmm-on-gcp-onboarding (tzpe-tlz-tlz-de)$ gcloud services list | grep NAME
NAME: accesscontextmanager.googleapis.com
NAME: appengine.googleapis.com
NAME: artifactregistry.googleapis.com
NAME: cloudbilling.googleapis.com
NAME: cloudbuild.googleapis.com
NAME: cloudidentity.googleapis.com
NAME: cloudkms.googleapis.com
NAME: cloudresourcemanager.googleapis.com
NAME: compute.googleapis.com
NAME: containerregistry.googleapis.com
NAME: iam.googleapis.com
NAME: iamcredentials.googleapis.com
NAME: logging.googleapis.com
NAME: oslogin.googleapis.com
NAME: pubsub.googleapis.com
NAME: secretmanager.googleapis.com
NAME: serviceusage.googleapis.com
NAME: sourcerepo.googleapis.com
NAME: storage-api.googleapis.com

move code from prod to common - expand identity lists and role assignments to the groups later

procedure to add the terraform service account as a groups admin in admin.google.com
https://github.com/GoogleCloudPlatform/pbmm-on-gcp-onboarding/issues/271#issuecomment-1661425718
file list
        new file:   environments/common/iam-groups.auto.tfvars
        new file:   environments/common/iam-groups.tf
        modified:   environments/common/variables.tf
environments/bootstrap/bootstrap.sh
environments/bootstrap/bootstrap.auto.tfvars

Adding roles to groups

https://registry.terraform.io/modules/terraform-google-modules/iam/google/latest

        modified:   environments/common/iam-groups.auto.tfvars
        modified:   environments/common/iam-groups.tf
        modified:   environments/common/outputs.tf
        modified:   environments/common/variables.tf
        modified:   environments/prod/main.tf

adding plural groups
note that adding multiple members will require recreation for now of the group - as it is mode authorative vs additive
Step #4 - "tf apply": │ Error: Error creating Group: googleapi: Error 409: Error(2018): Cannot create group<EMAIL_ADDRESS>because it already exists.

multiple groups and roles ok - merging PR

rough pr
/**
 * Copyright 2023 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

# https://github.com/GoogleCloudPlatform/pbmm-on-gcp-onboarding/issues/271
# the terraform service account must be added in admin.google.com as a groups admin
# https://admin.google.com/ac/roles/58150197607268354
# move to common
module "group_opsadmin" {
  source  = "terraform-google-modules/group/google"
  version = "~> 0.6"

  id           = var.iam-group_opsadmin.id
  display_name = var.iam-group_opsadmin.display_name
  description  = var.iam-group_opsadmin.description
  domain       = var.iam-group_opsadmin.domain
  #owners       = var.iam-group_opsadmin.owners
  #managers     = var.iam-group_opsadmin.managers
  members      = var.iam-group_opsadmin.members
}

module "group_secadmin" {
  source  = "terraform-google-modules/group/google"
  version = "~> 0.6"

  id           = var.iam-group_secadmin.id
  display_name = var.iam-group_secadmin.display_name
  description  = var.iam-group_secadmin.description
  domain       = var.iam-group_secadmin.domain
  #owners       = var.iam-group_secadmin.owners
  #managers     = var.iam-group_secadmin.managers
  members      = var.iam-group_secadmin.members
}
module "group_telcoadmin" {
  source  = "terraform-google-modules/group/google"
  version = "~> 0.6"

  id           = var.iam-group_telcoadmin.id
  display_name = var.iam-group_telcoadmin.display_name
  description  = var.iam-group_telcoadmin.description
  domain       = var.iam-group_telcoadmin.domain
  #owners       = var.iam-group_telcoadmin.owners
  #managers     = var.iam-group_telcoadmin.managers
  members      = var.iam-group_telcoadmin.members
}
module "group_read" {
  source  = "terraform-google-modules/group/google"
  version = "~> 0.6"

  id           = var.iam-group_read.id
  display_name = var.iam-group_read.display_name
  description  = var.iam-group_read.description
  domain       = var.iam-group_read.domain
  #owners       = var.iam-group_read.owners
  #managers     = var.iam-group_read.managers
  members      = var.iam-group_read.members
}
module "group_billing" {
  source  = "terraform-google-modules/group/google"
  version = "~> 0.6"

  id           = var.iam-group_billing.id
  display_name = var.iam-group_billing.display_name
  description  = var.iam-group_billing.description
  domain       = var.iam-group_billing.domain
  #owners       = var.iam-group_billing.owners
  #managers     = var.iam-group_billing.managers
  members      = var.iam-group_billing.members
}
module "group_networkadmin" {
  source  = "terraform-google-modules/group/google"
  version = "~> 0.6"

  id           = var.iam-group_networkadmin.id
  display_name = var.iam-group_networkadmin.display_name
  description  = var.iam-group_networkadmin.description
  domain       = var.iam-group_networkadmin.domain
  #owners       = var.iam-group_networkadmin.owners
  #managers     = var.iam-group_networkadmin.managers
  members      = var.iam-group_networkadmin.members
}
module "iam-groups-roles" {
  source           = "../../modules/iam"
  #sa_create_assign = var.iam-groups.id #var.service_accounts
  #project_iam      = local.project_iam
  #folder_iam       = local.folder_iam
  organization_iam = var.organization_iam_group_opsadmin
  organization     = local.organization_config.org_id
  depends_on = [
    module.group_opsadmin#,
    #module.core-org-custom-roles,
    #module.core-folders
  ]
}

module "iam-groups-role_networkadmin" {
  source           = "../../modules/iam"
  #sa_create_assign = var.iam-groups.id #var.service_accounts
  #project_iam      = local.project_iam
  #folder_iam       = local.folder_iam
  organization_iam = var.organization_iam_group_networkadmin
  organization     = local.organization_config.org_id
  depends_on = [
    module.group_networkadmin#,
    #module.core-org-custom-roles,
    #module.core-folders
  ]
}

module "iam-groups-role_secadmin" {
  source           = "../../modules/iam"
  #sa_create_assign = var.iam-groups.id #var.service_accounts
  #project_iam      = local.project_iam
  #folder_iam       = local.folder_iam
  organization_iam = var.organization_iam_group_secadmin
  organization     = local.organization_config.org_id
  depends_on = [
    module.group_secadmin#,
    #module.core-org-custom-roles,
    #module.core-folders
  ]
}

module "iam-groups-role_telcoadmin" {
  source           = "../../modules/iam"
  #sa_create_assign = var.iam-groups.id #var.service_accounts
  #project_iam      = local.project_iam
  #folder_iam       = local.folder_iam
  organization_iam = var.organization_iam_group_telcoadmin
  organization     = local.organization_config.org_id
  depends_on = [
    module.group_telcoadmin#,
    #module.core-org-custom-roles,
    #module.core-folders
  ]
}

module "iam-groups-role_read" {
  source           = "../../modules/iam"
  #sa_create_assign = var.iam-groups.id #var.service_accounts
  #project_iam      = local.project_iam
  #folder_iam       = local.folder_iam
  organization_iam = var.organization_iam_group_read
  organization     = local.organization_config.org_id
  depends_on = [
    module.group_read#,
    #module.core-org-custom-roles,
    #module.core-folders
  ]
}

module "iam-groups-role_billing" {
  source           = "../../modules/iam"
  #sa_create_assign = var.iam-groups.id #var.service_accounts
  #project_iam      = local.project_iam
  #folder_iam       = local.folder_iam
  organization_iam = var.organization_iam_group_billing
  organization     = local.organization_config.org_id
  depends_on = [
    module.group_billing#,
    #module.core-org-custom-roles,
    #module.core-folders
  ]
}
/*
# https://github.com/GoogleCloudPlatform/pbmm-on-gcp-onboarding/issues/271
# the terraform service account must be added in admin.google.com as a groups admin
# https://admin.google.com/ac/roles/58150197607268354
# move to common
module "groups" {
  source  = "terraform-google-modules/group/google"
  version = "~> 0.6"

  id           = var.iam-groups.id
  display_name = var.iam-groups.display_name
  description  = var.iam-groups.description
  domain       = var.iam-groups.domain
  #owners       = var.iam-groups.owners
  #managers     = var.iam-groups.managers
  members      = var.iam-groups.members
}

module "iam-groups-roles" {
  source           = "../../modules/iam"
  #sa_create_assign = var.iam-groups.id #var.service_accounts
  #project_iam      = local.audit_project_iam
  #folder_iam       = local.folder_iam
  organization_iam = var.organization_iam_groups
  organization     = local.organization_config.org_id
  depends_on = [
    module.groups#,
    #module.core-org-custom-roles,
    #module.core-folders
  ]
}*/

# add roles to groups
# https://registry.terraform.io/modules/terraform-google-modules/iam/google/latest
# https://registry.terraform.io/modules/terraform-google-modules/iam/google/7.6.0/submodules/organizations_iam
/*module "organization-iam-bindings" {
  source        = "terraform-google-modules/iam/google//modules/organizations_iam"
  organizations = ["my-organization_one"]
  #mode          = "authoritative"
  mode          = "additive"

  bindings = {
    "roles/resourcemanager.organizationViewer" = [
<EMAIL_ADDRESS><EMAIL_ADDRESS><EMAIL_ADDRESS>    ]
    "roles/resourcemanager.projectDeleter" = [
<EMAIL_ADDRESS><EMAIL_ADDRESS><EMAIL_ADDRESS>    ]
  }
  conditional_bindings = [
    {
      role = "roles/editor"
      title = "expires_after_2019_12_31"
      description = "Expiring at midnight of 2019-12-31"
      expression = "request.time < timestamp(\"2020-01-01T00:00:00Z\")"
      members =<EMAIL_ADDRESS>    }
  ]
}*/

tfvars

/**
 * Copyright 2023 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/*
iam-groups = {
  id           =<EMAIL_ADDRESS>  display_name = "security"
  description  = "security group"
  domain       = "terraform.landing.systems"
  #owners       =<EMAIL_ADDRESS><EMAIL_ADDRESS># var.service_accounts
  #managers     =<EMAIL_ADDRESS>  members      =<EMAIL_ADDRESS><EMAIL_ADDRESS>}*/

# when updating - recreate the entire group - authorative vs additive
iam-group_opsadmin = {
  id           =<EMAIL_ADDRESS>  display_name = "opsadmin"
  description  = "ops admin group"
  domain       = "terraform.landing.systems"
  #owners       =<EMAIL_ADDRESS><EMAIL_ADDRESS># var.service_accounts
  #managers     =<EMAIL_ADDRESS>  members      =<EMAIL_ADDRESS><EMAIL_ADDRESS>}

iam-group_networkadmin = {
  id           =<EMAIL_ADDRESS>  display_name = "networkadmin"
  description  = "network admin group"
  domain       = "terraform.landing.systems"
  #owners       =<EMAIL_ADDRESS><EMAIL_ADDRESS># var.service_accounts
  #managers     =<EMAIL_ADDRESS>  members      =<EMAIL_ADDRESS><EMAIL_ADDRESS>}

iam-group_telcoadmin = {
  id           =<EMAIL_ADDRESS>  display_name = "telcoadmin"
  description  = "telco admin group"
  domain       = "terraform.landing.systems"
  #owners       =<EMAIL_ADDRESS><EMAIL_ADDRESS># var.service_accounts
  #managers     =<EMAIL_ADDRESS>  members      =<EMAIL_ADDRESS><EMAIL_ADDRESS>}

iam-group_secadmin = {
  id           =<EMAIL_ADDRESS>  display_name = "secadmin"
  description  = "security admin group"
  domain       = "terraform.landing.systems"
  #owners       =<EMAIL_ADDRESS><EMAIL_ADDRESS># var.service_accounts
  #managers     =<EMAIL_ADDRESS>  members      =<EMAIL_ADDRESS><EMAIL_ADDRESS>}

iam-group_read = {
  id           =<EMAIL_ADDRESS>  display_name = "read"
  description  = "read group"
  domain       = "terraform.landing.systems"
  #owners       =<EMAIL_ADDRESS><EMAIL_ADDRESS># var.service_accounts
  #managers     =<EMAIL_ADDRESS>  members      =<EMAIL_ADDRESS>}

iam-group_billing = {
  id           =<EMAIL_ADDRESS>  display_name = "billing"
  description  = "billing group"
  domain       = "terraform.landing.systems"
  #owners       =<EMAIL_ADDRESS><EMAIL_ADDRESS># var.service_accounts
  #managers     =<EMAIL_ADDRESS>  members      =<EMAIL_ADDRESS>}

organization_iam_groups = [
  {
    member       =<EMAIL_ADDRESS># REQUIRED EDIT<EMAIL_ADDRESS>    organization = "131880894992" #Insert your Ord ID here, format ############
    roles = [
      "roles/viewer",
    ]
  }#,
   # {
   # member       =<EMAIL_ADDRESS># REQUIRED EDIT<EMAIL_ADDRESS>   # organization = "131880894992" #Insert your Ord ID here, format ############
   # roles = [
   #   "roles/viewer",
   # ]
  #}
]

organization_iam_group_secadmin = [
  {
    member       =<EMAIL_ADDRESS># REQUIRED EDIT<EMAIL_ADDRESS>    organization = "131880894992" #Insert your Ord ID here, format ############
    roles = [
      "roles/viewer",
    ]
  }
]

organization_iam_group_networkadmin = [
  {
    member       =<EMAIL_ADDRESS># REQUIRED EDIT<EMAIL_ADDRESS>    organization = "131880894992" #Insert your Ord ID here, format ############
    roles = [
      "roles/viewer",
    ]
  }
]

organization_iam_group_telcoadmin = [
  {
    member       =<EMAIL_ADDRESS># REQUIRED EDIT<EMAIL_ADDRESS>    organization = "131880894992" #Insert your Ord ID here, format ############
    roles = [
      "roles/viewer",
    ]
  }
]

organization_iam_group_read = [
  {
    member       =<EMAIL_ADDRESS># REQUIRED EDIT<EMAIL_ADDRESS>    organization = "131880894992" #Insert your Ord ID here, format ############
    roles = [
      "roles/viewer",
    ]
  }
]

organization_iam_group_billing = [
  {
    member       =<EMAIL_ADDRESS># REQUIRED EDIT<EMAIL_ADDRESS>    organization = "131880894992" #Insert your Ord ID here, format ############
    roles = [
      "roles/viewer",
    ]
  }
]

organization_iam_group_opsadmin = [
  {
    member       =<EMAIL_ADDRESS># REQUIRED EDIT<EMAIL_ADDRESS>    organization = "131880894992" #Insert your Ord ID here, format ############
    roles = [
      "roles/viewer",
    ]
  }
]

test results

The top-level README should add instructions and screenshots about configuring Google Workspace for adding the SA to the Groups Admin role as per:
this comment
It took me half a day to fight this bug. There's no clear instruction (or even clear diagnosis) on the general internet of how to solve this terraform error, until I found that excellent comment (with screenshots of Google Workspace admin console) in this thread.

Vincent, hi thank you for your comment.  The repo is currently going through a retrofit where we are merging several customer oriented versions into the public repo - it is a work in progress over the last 2 weeks and will likely last a couple weeks more before we tag/version the repo
The terraform service account automation for group addition does have a manual workaround "for now" due to out of band GCP API constraints.
This change came in recently and requires documentation.
The readme addition is in the evolving work items queue under
https://github.com/GoogleCloudPlatform/pbmm-on-gcp-onboarding/issues/308
which references the currently documented "rough" but not ready for read me version
https://github.com/GoogleCloudPlatform/pbmm-on-gcp-onboarding/issues/271#issuecomment-1661425718
I myself ran into this issue and found the workaround as well and did a quick writeup but due to ongoing prioritization triage the change is still pending -  will send you and update when we can get the readme change in.
thank you
/michael

20240406: Closing issue during retrofit/rebase of this TEF V1 based/modified repo to TEF V4 standards
This issue may participate in the LZ refactor after rebase
Query on all issues related to the older V1 version via the tag
https://github.com/GoogleCloudPlatform/pbmm-on-gcp-onboarding/labels/2024-pre-tef-v4


[Obsolete] attribute advises use of nonexistent method

The [Obsolete] attribute on obsolete extension method FromStream advises use of method "BitmpaContext.FromStream", which does not exist. The attribute should instead advise use of BitmapFactory.FromStream, which does exist.

Good catch. Thanks!


themes option hidden by Properties tab

Clicking the Editor Themes icon while the Properties tab is selected does not cause the themes widget to be visible. It is likely hidden behind the properties tab.

Metadata Editor .less: z-index          : 10000;

Woops, didn't mean to hit submit so quickly.
So do we want to show the Theme Selector for the editor when the Metadata Editor is open, or just hide that toggle and display only when using the Style or Brew editors?
On my Theme Selector PR, I currently have the theme selector dropdown using the same gray as the metadata editor, which isn't great.  But that is a moot point if we don't allow Editor theme selection when an editor isn't open/visible.

(or we could gray it out as 'non functional' when viewing metadata editor)

This seems reasonable. We do dim/disable the undo/redo buttons on the Properties panel.

The themes dropdown is now appearing above the properties panel layer so this could be closed. However ..
I would prefer that the themes toolbar button is instead disabled/dimmed when Properties is displayed.

As a workaround, this issue is currently fixed in master by setting the following rule in CSS:
.brewRenderer :where(.pages) *[id] {
    scroll-margin-top: 100px;
}


imagecodecs no longer compiles with python 3.8

Changed minimum python requirement to 3.9

thanks!


No connection to Solarman after power cut

After a circuit breaker blew during building work yesterday I have no connection to Solarman devices.
Here the first Log:
Logger: homeassistant.components.recorder.util
Source: components/recorder/util.py:217
Integration: Recorder (documentation, issues)
First occurred: 7 October 2022 at 14:26:04 (1 occurrences)
Last logged: 7 October 2022 at 14:26:04
The system could not validate that the sqlite3 database at //config/home-assistant_v2.db was shutdown cleanly
Any help getting back up and running would be appreciated!
Thanks

I don't think this is related to solarman, more a genearal HA Issue


Promise To Wait For Download   never finished

Describe the bug
  Configurations click on export button
      ${dl_promise}        Promise To Wait For Download    ${download_dir}
      Wait For Elements State       ${xp_welcome_user_get_first_ack_date}
      Click    ${xp_welcome_user_configurations_export_button}
      log to console    ${dl_promise}
      ${file_obj}=         Wait For     ${dl_promise}
      File Should Exist    ${file_obj}[saveAs]
      Should Be True       ${file_obj.suggestedFilename}

${file_obj}=         Wait For     ${dl_promise} --> NEVER exited
After 10 minutes file is downloaded but Wait For is stille executed.
To Reproduce
see above
Desktop (please complete the following information):

OS: MacOS
Browser [chromium]

I do not see anything wrong in your keyword usage. Only thing which can not be seen from the example that when the new context is opened and how it is configured. Also please remember that new context may be automatically closed and new one is automatically opened, but without the acceptDownloads=True. Please check the https://marketsquare.github.io/robotframework-browser/Browser.html#Automatic page and context closing for more details.

Yes thanks but browser setted with context and parameter acceptDownloads=True

It's not only about acceptDownloads=True, it's also when the context was created and what is auto_closing_level. Could tell what is auto_closing_level value and where the context is created (suite setup or in  test and which suite/test) and where the download happens (test and suite)

Hi, thanks !
auto_closing_level is not setted, so 'TEST' value is by default.
*** Settings ***
Library           Browser
Resource          variables.robot
Test Teardown     Close Browser  ALL

*** Test Cases ***
Exporter function has to export all the table columns including Dernier acquittement du device
    Configurations click on export button

*** Keywords ***

Configurations click on export button
    ${dl_promise}        Promise To Wait For Download    ${download_dir}
    Wait For Elements State       ${xp_welcome_user_get_first_ack_date}
    Click    ${xp_welcome_user_configurations_export_button}
    log to console    ${dl_promise}
    ${file_obj}=         Wait For     ${dl_promise}
    File Should Exist    ${file_obj}[saveAs]
    Should Be True       ${file_obj.suggestedFilename}

But where the New Browser/Context/Page keywords gets called, that test does not work as standalone.

Yes, updated =
*** Settings ***
Library           Browser
Resource          variables.robot
Test Teardown     Close Browser  ALL

*** Test Cases ***
Exporter function has to export all the table columns including Dernier acquittement du device
    connect to papyrus cc
    Configurations click on export button

*** Keywords ***
Connect to papyrusCC
    [Arguments]    ${browser}=chromium
    Set Browser Timeout     20
    New Browser    ${browser}   %{HEADLESS=false}    downloadsPath=${download_dir}
    New Context    locale=fr   acceptDownloads=True   extraHTTPHeaders={'xxx': 'xxx', 'xxx': 'John', 'xxxx': 'xxxxx', 'xxxx' : 'xxxx'}
    New Page       http://xxxxxxx:9081/xxxxx/

Configurations click on export button
    ${dl_promise}        Promise To Wait For Download    ${download_dir}
    Wait For Elements State       ${xp_welcome_user_get_first_ack_date}
    Click    ${xp_welcome_user_configurations_export_button}
    log to console    ${dl_promise}
    ${file_obj}=         Wait For     ${dl_promise}
    File Should Exist    ${file_obj}[saveAs]
    Should Be True       ${file_obj.suggestedFilename}

If you test is written like that, Browser, Context and Page are opened in same test, then download should work, but for some reason it does not. Next step would be to look at playwright debug logs. Could you enable enable_playwright_debug=True in you library import and show us the playwright-log.txt file from the output directory. Please note that the log file contains everything as plain text, so remove sensitive information before downloading.

Yes,
As follow : (note that never ending... :o )
{"level":30,"time":"2021-04-12T12:24:22.454Z","pid":50630,"hostname":"MacBook-Pro-de-Thibault.local","msg":"Listening on 60348"}
================= Original suppressed error =================
Error: Browser has been closed.
at PlaywrightState.getActiveBrowser (/Users/thibaultsaussac/Library/Python/3.8/lib/python/site-packages/Browser/wrapper/index.js:69302:23)
at PlaywrightServer.getActiveBrowser (/Users/thibaultsaussac/Library/Python/3.8/lib/python/site-packages/Browser/wrapper/index.js:67370:79)
at PlaywrightServer. (/Users/thibaultsaussac/Library/Python/3.8/lib/python/site-packages/Browser/wrapper/index.js:67723:98)
at step (/Users/thibaultsaussac/Library/Python/3.8/lib/python/site-packages/Browser/wrapper/index.js:67341:23)
at Object.next (/Users/thibaultsaussac/Library/Python/3.8/lib/python/site-packages/Browser/wrapper/index.js:67322:53)
at /Users/thibaultsaussac/Library/Python/3.8/lib/python/site-packages/Browser/wrapper/index.js:67316:71
at new Promise ()
at webpack_modules../node/playwright-wrapper/grpc-service.ts.__awaiter (/Users/thibaultsaussac/Library/Python/3.8/lib/python/site-packages/Browser/wrapper/index.js:67312:12)
at PlaywrightServer.webpack_modules../node/playwright-wrapper/grpc-service.ts.PlaywrightServer.setTimeout (/Users/thibaultsaussac/Library/Python/3.8/lib/python/site-packages/Browser/wrapper/index.js:67714:16)
at handleUnary (/Users/thibaultsaussac/Library/Python/3.8/lib/python/site-packages/Browser/wrapper/index.js:17039:13)
2021-04-12T12:24:22.553Z pw:api => browserType.launch started
2021-04-12T12:24:23.181Z pw:api <= browserType.launch succeeded
2021-04-12T12:24:23.210Z pw:api => browser.newContext started
2021-04-12T12:24:23.236Z pw:api <= browser.newContext succeeded
2021-04-12T12:24:23.247Z pw:api => browserContext.addInitScript started
2021-04-12T12:24:23.248Z pw:api <= browserContext.addInitScript succeeded
{"level":30,"time":"2021-04-12T12:24:23.273Z","pid":50630,"hostname":"MacBook-Pro-de-Thibault.local","msg":"Changed active context"}
2021-04-12T12:24:23.302Z pw:api => browserContext.newPage started
2021-04-12T12:24:23.969Z pw:api <= browserContext.newPage succeeded
{"level":30,"time":"2021-04-12T12:24:23.969Z","pid":50630,"hostname":"MacBook-Pro-de-Thibault.local","msg":"Video path: undefined"}
{"level":30,"time":"2021-04-12T12:24:23.969Z","pid":50630,"hostname":"MacBook-Pro-de-Thibault.local","msg":"Changed active page"}
2021-04-12T12:24:23.970Z pw:api => page.goto started
2021-04-12T12:24:23.972Z pw:api navigating to "xxxx", waiting until "load"
2021-04-12T12:24:24.109Z pw:api   navigated to "xxxxxx"
2021-04-12T12:24:30.965Z pw:api   "domcontentloaded" event fired
2021-04-12T12:24:31.060Z pw:api   navigated to "xxxxx"
2021-04-12T12:24:32.293Z pw:api   "domcontentloaded" event fired
2021-04-12T12:24:32.299Z pw:api   "load" event fired
2021-04-12T12:24:32.299Z pw:api <= page.goto succeeded
2021-04-12T12:24:32.306Z pw:api => page.waitForSelector started
2021-04-12T12:24:32.309Z pw:api waiting for selector "//td" to be visible
2021-04-12T12:24:32.944Z pw:api   navigated to "http://xxxxxx"
2021-04-12T12:24:33.012Z pw:api   selector resolved to visible …
2021-04-12T12:24:33.069Z pw:api <= page.waitForSelector succeeded
2021-04-12T12:24:33.073Z pw:api => page.click started
2021-04-12T12:24:33.074Z pw:api waiting for selector "//td[contains(.,'Configurations')]"
2021-04-12T12:24:33.076Z pw:api   selector resolved to visible …
2021-04-12T12:24:33.079Z pw:api attempting click action
2021-04-12T12:24:33.079Z pw:api   waiting for element to be visible, enabled and stable
2021-04-12T12:24:33.116Z pw:api   element is visible, enabled and stable
2021-04-12T12:24:33.116Z pw:api   scrolling into view if needed
2021-04-12T12:24:33.117Z pw:api   done scrolling
2021-04-12T12:24:33.119Z pw:api   checking that element receives pointer events at (130.47,156)
2021-04-12T12:24:33.122Z pw:api   element does receive pointer events
2021-04-12T12:24:33.122Z pw:api   performing click action
2021-04-12T12:24:33.175Z pw:api   navigated to "http://<IP_ADDRESS>:9081/SAVOIP2/#Configurations"
2021-04-12T12:24:33.202Z pw:api   click action done
2021-04-12T12:24:33.204Z pw:api   waiting for scheduled navigations to finish
2021-04-12T12:24:33.213Z pw:api   navigations have finished
2021-04-12T12:24:33.214Z pw:api <= page.click succeeded
2021-04-12T12:24:33.220Z pw:api => page.click started
2021-04-12T12:24:33.220Z pw:api waiting for selector "//[@id="isc_3S"]"
2021-04-12T12:24:33.239Z pw:api   selector resolved to visible …
2021-04-12T12:24:33.242Z pw:api attempting click action
2021-04-12T12:24:33.242Z pw:api   waiting for element to be visible, enabled and stable
2021-04-12T12:24:33.265Z pw:api   element is visible, enabled and stable
2021-04-12T12:24:33.265Z pw:api   scrolling into view if needed
2021-04-12T12:24:33.265Z pw:api   done scrolling
2021-04-12T12:24:33.266Z pw:api   checking that element receives pointer events at (629,141)
2021-04-12T12:24:33.270Z pw:api
… intercepts pointer events
2021-04-12T12:24:33.270Z pw:api retrying click action, attempt #1
2021-04-12T12:24:33.270Z pw:api   waiting for element to be visible, enabled and stable
2021-04-12T12:24:33.300Z pw:api   element is visible, enabled and stable
2021-04-12T12:24:33.300Z pw:api   scrolling into view if needed
2021-04-12T12:24:33.303Z pw:api   done scrolling
2021-04-12T12:24:33.304Z pw:api   checking that element receives pointer events at (629,141)
2021-04-12T12:24:33.306Z pw:api
… intercepts pointer events
2021-04-12T12:24:33.306Z pw:api retrying click action, attempt #2
2021-04-12T12:24:33.306Z pw:api   waiting 20ms
2021-04-12T12:24:33.328Z pw:api   waiting for element to be visible, enabled and stable
2021-04-12T12:24:33.333Z pw:api   element is visible, enabled and stable
2021-04-12T12:24:33.334Z pw:api element was detached from the DOM, retrying
2021-04-12T12:24:33.334Z pw:api waiting for selector "//[@id="isc_3S"]"
2021-04-12T12:24:33.335Z pw:api   selector resolved to visible …
2021-04-12T12:24:33.337Z pw:api attempting click action
2021-04-12T12:24:33.337Z pw:api   waiting for element to be visible, enabled and stable
2021-04-12T12:24:33.366Z pw:api   element is visible, enabled and stable
2021-04-12T12:24:33.366Z pw:api   scrolling into view if needed
2021-04-12T12:24:33.367Z pw:api   done scrolling
2021-04-12T12:24:33.368Z pw:api   checking that element receives pointer events at (603,141)
2021-04-12T12:24:33.370Z pw:api   element does receive pointer events
2021-04-12T12:24:33.370Z pw:api   performing click action
2021-04-12T12:24:33.401Z pw:api   click action done
2021-04-12T12:24:33.401Z pw:api   waiting for scheduled navigations to finish
2021-04-12T12:24:33.414Z pw:api   navigations have finished
2021-04-12T12:24:33.415Z pw:api <= page.click succeeded
2021-04-12T12:24:33.418Z pw:api => page.click started
2021-04-12T12:24:33.419Z pw:api waiting for selector "text="AID""
2021-04-12T12:24:33.428Z pw:api   selector resolved to visible AID
2021-04-12T12:24:33.430Z pw:api attempting click action
2021-04-12T12:24:33.430Z pw:api   waiting for element to be visible, enabled and stable
2021-04-12T12:24:33.448Z pw:api   element is visible, enabled and stable
2021-04-12T12:24:33.448Z pw:api   scrolling into view if needed
2021-04-12T12:24:33.448Z pw:api   done scrolling
2021-04-12T12:24:33.449Z pw:api   checking that element receives pointer events at (478.17,193)
2021-04-12T12:24:33.451Z pw:api   element does receive pointer events
2021-04-12T12:24:33.451Z pw:api   performing click action
2021-04-12T12:24:33.462Z pw:api   click action done
2021-04-12T12:24:33.462Z pw:api   waiting for scheduled navigations to finish
2021-04-12T12:24:33.464Z pw:api   navigations have finished
2021-04-12T12:24:33.464Z pw:api <= page.click succeeded
2021-04-12T12:24:33.467Z pw:api => page.waitForSelector started
2021-04-12T12:24:33.468Z pw:api waiting for selector "//[@id="xxx"]" to be visible
2021-04-12T12:24:33.470Z pw:api   selector resolved to visible <input $9a="$9b" type="TEXT" id="xx" tabindex="1712…/>
2021-04-12T12:24:33.473Z pw:api <= page.waitForSelector succeeded
2021-04-12T12:24:33.476Z pw:api => page.fill started
2021-04-12T12:24:33.477Z pw:api waiting for selector "//[@id="xx"]"
2021-04-12T12:24:33.480Z pw:api   selector resolved to visible <input $9a="$9b" type="TEXT" id="xx" tabindex="1712…/>
2021-04-12T12:24:33.482Z pw:api elementHandle.fill("xx")
2021-04-12T12:24:33.482Z pw:api   waiting for element to be visible, enabled and editable
2021-04-12T12:24:33.486Z pw:api   element is visible, enabled and editable
2021-04-12T12:24:33.504Z pw:api <= page.fill succeeded
2021-04-12T12:24:33.507Z pw:api => page.click started
2021-04-12T12:24:33.507Z pw:api waiting for selector "//[@id="xx"]"
2021-04-12T12:24:33.510Z pw:api   selector resolved to visible …
2021-04-12T12:24:33.511Z pw:api attempting click action
2021-04-12T12:24:33.511Z pw:api   waiting for element to be visible, enabled and stable
2021-04-12T12:24:33.531Z pw:api   element is visible, enabled and stable
2021-04-12T12:24:33.531Z pw:api   scrolling into view if needed
2021-04-12T12:24:33.531Z pw:api   done scrolling
2021-04-12T12:24:33.532Z pw:api   checking that element receives pointer events at (797.99,213)
2021-04-12T12:24:33.534Z pw:api   element does receive pointer events
2021-04-12T12:24:33.534Z pw:api   performing click action
2021-04-12T12:24:33.558Z pw:api   click action done
2021-04-12T12:24:33.558Z pw:api   waiting for scheduled navigations to finish
2021-04-12T12:24:33.562Z pw:api   navigations have finished
2021-04-12T12:24:33.562Z pw:api <= page.click succeeded
2021-04-12T12:24:33.584Z pw:api => page.waitForSelector started
2021-04-12T12:24:33.584Z pw:api waiting for selector "//[@class="xxx"]//tr[x]/td[x]/div" to be visible
2021-04-12T12:24:33.586Z pw:api => page.waitForEvent started
2021-04-12T12:24:33.588Z pw:api waiting for event "download"
2021-04-12T12:24:33.825Z pw:api   selector resolved to visible …
2021-04-12T12:24:33.831Z pw:api <= page.waitForSelector succeeded
2021-04-12T12:24:33.835Z pw:api => page.click started
2021-04-12T12:24:33.835Z pw:api waiting for selector "//*[@name="xxxx"]"
2021-04-12T12:24:33.838Z pw:api   selector resolved to visible
2021-04-12T12:24:33.843Z pw:api attempting click action
2021-04-12T12:24:33.843Z pw:api   waiting for element to be visible, enabled and stable
2021-04-12T12:24:33.865Z pw:api   element is visible, enabled and stable
2021-04-12T12:24:33.865Z pw:api   scrolling into view if needed
2021-04-12T12:24:33.865Z pw:api   done scrolling
2021-04-12T12:24:33.866Z pw:api   checking that element receives pointer events at (1182.37,697)
2021-04-12T12:24:33.868Z pw:api   element does receive pointer events
2021-04-12T12:24:33.868Z pw:api   performing click action
2021-04-12T12:24:33.883Z pw:api   click action done
2021-04-12T12:24:33.883Z pw:api   waiting for scheduled navigations to finish
2021-04-12T12:24:33.886Z pw:api   navigations have finished
2021-04-12T12:24:33.887Z pw:api <= page.click succeeded
2021-04-12T12:24:34.211Z pw:api   "domcontentloaded" event fired
2021-04-12T12:24:34.212Z pw:api   "load" event fired
2021-04-12T12:24:34.472Z pw:api <= page.waitForEvent succeeded
2021-04-12T12:24:34.499Z pw:api => download.saveAs started

Interesting, last lines of logs indicates that download did start, but it does not end. Interesting, which means that I am out of ideas...

exactly... not understandable :(

Maybe related to this playwright problem? https://github.com/microsoft/playwright/issues/5962

Promise to Wait for download seems to have an internal timeout.

I have the same issue in headful mode (chromium, robotframework==4.0.3, robotframework-browser==5.0.1), in headless mode it just fails with Error: .saveAs: EPERM: operation not permitted, copyfile '...\robot_downloads\02ce5a1e-bfdf-4be9-977b-71daa7112eec' -> '...\robot_downloads' error

Just a check. Did you enable downloading by adding the option acceptDownload=True when creating new context?
Otherwise downloading is not possible at all

Just a check. Did you enable downloading by adding the option acceptDownload=True when creating new context?
Otherwise downloading is not possible at all

Yes, I'm using Wait For Download keyword rn and it works, but with Promise To Wait For Download it doesn't (used it same as in docs example)

New Browser    ${browser}   %{HEADLESS=false}    downloadsPath=${download_dir}
Here, delete  downloadsPath=${download_dir}
try again

As if i see it correctly this has been solved on the Playwright side.
Therefore closing this issue.
I tested it and imho it works fine now.


Support Hive 0.12 ORC files

Support ORC files generated by Hive 0.12:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ORC

There is an ORC project written in C++ that could help once the implementation is complete:
https://github.com/hortonworks/orc

The design of cstore file layout is inspired by ORC, but it's not an implementation of ORC and it doesn't intend to support ORC files generated by Hive.


chore(master): release 1.1.15

:robot: I have created a release beep boop
1.1.15 (2023-04-14)
Miscellaneous

deps: update dependency phpunit/phpunit to v10.1.0 (ae0f52c)

This PR was generated with Release Please. See documentation.

:robot: Release is at https://github.com/wayofdev/php-cs-fixer-config/releases/tag/v1.1.15 :sunflower:


[8.0] Added optional merge of config raw columns to rawColumns method

This pull request allows the optional merging of the raw columns defined in the config, and any new ones that you may want to add.
From my point of view, it seems odd that rawColumns was removing the ones defined in config, we use the ones defined on config as default across all tables, e.g. actions, so setting rawColumn(['state']) caused actions to disappear.
The pull request is written for backwards compatiblity, it won't merge unless true is passed.
Example:
In config
    /*
     * Default columns definition of dataTable utility functions.
     */
    'columns' => [

        /*
         * List of columns that are allowed to display html content.
         * Note: Adding columns to list will make us available to XSS attacks.
         */
        'raw' => ['action'],

Existing functionality
    return DataTables::eloquent($model)
                ->addColumn('link', 'Html Column')
                ->addColumn('action', 'path.to.view')
                ->rawColumns(['state'])
                ->toJson();

Results in raw columns as just state, the action column is no longer a raw column.
New merge functionality
    return DataTables::eloquent($model)
                ->addColumn('link', 'Html Column')
                ->addColumn('action', 'path.to.view')
                ->rawColumns(['state'], true)
                ->toJson();

Results in raw columns as state and action.
A variation in this idea could be a new method rawColumnsMerge, so existing method is left alone, and a new that just does merge could be used.

it is not clear. seems this method with second param true should stack raw columns if have several calls of this method, but it will stacked only with config raw columns, the previouse call will be ignored.
$datatables = datatables($query);
$raw_columns = ['category', 'article', 'name', 'image'];
$datatables->rawColumns($raw_columns, true);
// another manipulation
$raw_columns = ['warehouse'];
$datatables->rawColumns($raw_columns, true);

which result will be for raw columns ?


Documentation for components

The principal problem with using this template is the lack of documentation about what components do, this could have a lot more starts if the components have at least what props are expected or minimal use of them.

Thanks for your feedback! We're working on a V2 version of the boilerplate with a new UI and we'll improve the documentation of our components.

Thanks for your feedback! We're working on a V2 version of the boilerplate with a new UI and we'll improve the documentation of our components.


ng g migrate-module --name= stops at opening the module file.

Environment
Provide version numbers for the following components (information can be retrieved by running tns info in your project folder or by inspecting the package.json of the project):
√ Getting NativeScript components versions information...
√ Component nativescript has 6.1.2 version and is up to date.
√ Component tns-core-modules has 6.1.1 version and is up to date.
‼ Update available for component tns-android. Your current version is 6.1.1 and the latest available version is 6.1.2.
× Component tns-ios is not installed.
Angular CLI: 8.3.8
Node: 10.16.0
OS: win32 x64
Angular: 8.2.9
... animations, common, compiler, compiler-cli, core, forms
... language-service, platform-browser, platform-browser-dynamic
... router
Package                           Version
@angular-devkit/architect         0.802.2
@angular-devkit/build-angular     0.802.2
@angular-devkit/build-optimizer   0.802.2
@angular-devkit/build-webpack     0.802.2
@angular-devkit/core              8.2.2
@angular-devkit/schematics        8.2.2
@angular/cli                      8.3.8
@angular/http                     7.2.15
@ngtools/webpack                  8.2.2
@schematics/angular               8.3.8
@schematics/update                0.803.8
rxjs                              6.5.3
typescript                        3.5.3
webpack                           4.38.0
Describe the bug
ng g migrate-module --name= stops at opening the module file while it is expected to create the module.tns file and create /update the components within that module. Had to use CTRL+C key to exit out.
To Reproduce
ng g migrate-module --name=
Expected behavior
create the module.tns (this is other than the app module) file and create /update the components within that module.
Additional context
Raised a documentation bug for the order of sequence of steps for migration.
https://github.com/NativeScript/docs/issues/1812

Closing this issue as the issue is not seen with the latest version of NativeScript.
ng g migrate-module --name= works fine now. The order of migration steps need to change as provided in the nativescripts/docs for migrating existing project.
Though it stops for some time (few minutes) at file contents of the non -app module . It did complete in quick time.


Cannot use OpenShift 4.2 oauth

Steps to reproduce:

Install grafana-operator
Install an instance of grafana, using the oauth example: https://github.com/integr8ly/grafana-operator/tree/master/deploy/examples/oauth

The result is:
{"level":"info","ts":1579610197.342765,"logger":"kubebuilder.controller","caller":"controller/controller.go:134","msg":"Starting Controller","Controller":"grafanadashboard-controller"}
{"level":"info","ts":1579610197.342826,"logger":"kubebuilder.controller","caller":"controller/controller.go:134","msg":"Starting Controller","Controller":"grafanadatasource-controller"}
{"level":"info","ts":1579610197.342765,"logger":"kubebuilder.controller","caller":"controller/controller.go:134","msg":"Starting Controller","Controller":"grafana-controller"}
{"level":"info","ts":1579610197.4429429,"logger":"kubebuilder.controller","caller":"controller/controller.go:153","msg":"Starting workers","Controller":"grafanadashboard-controller","WorkerCount":1}
{"level":"info","ts":1579610197.4430351,"logger":"kubebuilder.controller","caller":"controller/controller.go:153","msg":"Starting workers","Controller":"grafana-controller","WorkerCount":1}
{"level":"info","ts":1579610197.4430861,"logger":"controller_grafana","caller":"grafana/grafana_controller.go:299","msg":"Phase: Install Grafana"}
{"level":"info","ts":1579610197.443132,"logger":"kubebuilder.controller","caller":"controller/controller.go:153","msg":"Starting workers","Controller":"grafanadatasource-controller","WorkerCount":1}
{"level":"info","ts":1579610197.444038,"logger":"controller_grafana","caller":"grafana/grafana_controller.go:326","msg":"adding volume for secret 'grafana-k8s-tls' as 'secret-grafana-k8s-tls'"}
{"level":"info","ts":1579610197.4440715,"logger":"controller_grafana","caller":"grafana/grafana_controller.go:326","msg":"adding volume for secret 'grafana-k8s-proxy' as 'secret-grafana-k8s-proxy'"}
{"level":"info","ts":1579610197.4440837,"logger":"controller_grafana","caller":"grafana/grafana_controller.go:379","msg":"adding extra container 'grafana-proxy' to 'grafana-deployment'"}
E0121 12:36:37.444157       1 runtime.go:66] Observed a panic: &runtime.TypeAssertionError{interfaceString:"interface {}", concreteString:"v1.Container", assertedString:"map[string]interface {}", missingMethod:""} (interface conversion: interface {} is v1.Container, not map[string]interface {})
/home/travis/gopath/src/github.com/integr8ly/grafana-operator/vendor/k8s.io/apimachinery/pkg/util/runtime/runtime.go:72
/home/travis/gopath/src/github.com/integr8ly/grafana-operator/vendor/k8s.io/apimachinery/pkg/util/runtime/runtime.go:65
/home/travis/gopath/src/github.com/integr8ly/grafana-operator/vendor/k8s.io/apimachinery/pkg/util/runtime/runtime.go:51
/home/travis/.gimme/versions/go1.10.8.linux.amd64/src/runtime/asm_amd64.s:573
/home/travis/.gimme/versions/go1.10.8.linux.amd64/src/runtime/panic.go:502
/home/travis/.gimme/versions/go1.10.8.linux.amd64/src/runtime/iface.go:252
/home/travis/gopath/src/github.com/integr8ly/grafana-operator/pkg/controller/grafana/grafana_controller.go:390
/home/travis/gopath/src/github.com/integr8ly/grafana-operator/pkg/controller/grafana/grafana_controller.go:301
/home/travis/gopath/src/github.com/integr8ly/grafana-operator/pkg/controller/grafana/grafana_controller.go:103
/home/travis/gopath/src/github.com/integr8ly/grafana-operator/vendor/sigs.k8s.io/controller-runtime/pkg/internal/controller/controller.go:207
/home/travis/gopath/src/github.com/integr8ly/grafana-operator/vendor/sigs.k8s.io/controller-runtime/pkg/internal/controller/controller.go:157
/home/travis/gopath/src/github.com/integr8ly/grafana-operator/vendor/k8s.io/apimachinery/pkg/util/wait/wait.go:133
/home/travis/gopath/src/github.com/integr8ly/grafana-operator/vendor/k8s.io/apimachinery/pkg/util/wait/wait.go:134
/home/travis/gopath/src/github.com/integr8ly/grafana-operator/vendor/k8s.io/apimachinery/pkg/util/wait/wait.go:88
/home/travis/.gimme/versions/go1.10.8.linux.amd64/src/runtime/asm_amd64.s:2361
panic: interface conversion: interface {} is v1.Container, not map[string]interface {} [recovered]
	panic: interface conversion: interface {} is v1.Container, not map[string]interface {}

Expected result:
The operator should install an working instance of Grafana.

@pb82 Hi,
Do you say this feature must be used at grafana namespace only?

@Daiki-Kawanuma what feature do you mean? The Grafana CR and the GrafanaDatasource CR are required to be created in the operator namespace. The GrafanaDashboard CR can be in other namespaces too if the operator is configured accordingly.

@pb82 Sorry for my poor English.
I want to ask you if the operator namespace name is restricted to "grafana".
It seems that your answer is "No".
Your answer: "(it's hardcoded to grafana)" confuse me.

@Daiki-Kawanuma no problem at all. The namespace name is not restricted to grafana. It's only  that some of the examples use grafana like for exampe  https://github.com/integr8ly/grafana-operator/tree/master/deploy/examples/oauth. If you want to try those examples, have a look at the resources first because sometimes they just assume that there exists a namespace with the name grafana. But you can of course change it to any name.

@pb82 Thank you! I got it!
Now I'm using Grafana Operator 2.0.0 so that it seems that spec.containers doesn't work.
I will update Grafana Operator 2.0.0 to 3.2.0

Ah yes, 2.0.0 is rather old and there is a known issue with spec.containers that was fixed in later versions. The latest release is 3.2.0 and you can find the image here: https://quay.io/repository/integreatly/grafana-operator?tab=tags

@pb82 I could have deploy Grafana and OAuth proxy with Grafana Operator 3.2.0.
Now I can login Grafana with cluster-admin user but cannot login with developer user.
cluster-admin user: "groups":["system:authenticated","system:cluster-admins"]}
developer user: "groups":["system:authenticated","system:authenticated:oauth"]
I want to realize multi tenancy that means developer users can only watch metrics of their own namespace.
What role should I add to developer user?

@Daiki-Kawanuma When using the auth proxy, we're limited by the config options in Grafana i.e. https://grafana.com/docs/grafana/latest/auth/auth-proxy/#auth-proxy-authentication
There is no tenancy capabilities this way from what I can see.
You would have to manage users manually (via orgs in Grafana perhaps?)


Ensure that all *.js files are using LF as the line ending.

Fix #1604

/cc @sebastienros

Current coverage is 100% (diff: 100%)

Merging #1670 into master will not change coverage

@@           master   #1670   diff @@
=====================================
  Files           1       1
  Lines        3985    3985
  Methods         0       0
  Messages        0       0
  Branches      691     691
=====================================
  Hits         3985    3985
  Misses          0       0
  Partials        0       0

Powered by Codecov. Last update 9e288fc...46eb60c


Update iterator.go

I suspect there's a memory leak for key slice that is not freed so I suggest following fix.  But on the other hand there's also an example in the source https://github.com/tecbot/gorocksdb/blob/master/iterator.go#L23 that also does not call Free(). So what is safe approach here? Is it ok not to Free() keySlice?

thanks, this was mostly a question and the code there was just to make it clear what exactly my misunderstanding was. Thanks for the explanation.


Toy DataSet - algorithmic_reverse_nlplike

Would a Toy DataSet(e.g. predict a reverse sentence) be useful  for sanity-check as used in tf-seq2seq?

We have some algorithmic problems which are quite simple.
You can see one used in the trainer test here:
https://github.com/tensorflow/tensor2tensor/blob/master/tensor2tensor/utils/trainer_utils_test.py
And some of the other algorithmic problems registered here:
https://github.com/tensorflow/tensor2tensor/blob/master/tensor2tensor/bin/t2t-datagen#L62
Do these datasets suffice for what you mean?

The algorithmic_reverse_decimal40 problem is similar. But it has only 10 symbols (digits) and they're uniformly distributed. I think it'd still be great to have a reversing problem on more realistic data, more tokens and maybe a different distribution. @ReDeiPirati would you be interested in adding one? I'd be happy to help.

@rsepassi sorry,  i've missed all the dataset generated from algorithmic because i've focused my attention only at the wmt and image problems. @lukaszkaiser that is exactly what i was looking for.  Well if you have some idea, i will be happy to contribute. What do you mean with realistic data? a noisy distribution? or simply a non uniform distribution?

I'm thinking about adding and algorithmic_reverse_nlplike task that:
(1) has more symbols, at least 8k, maybe 32k (more similar to word-level language tasks)
(2) chooses length from a Gaussian, not uniform distribution (or even sth more natural).
(3) chooses the symbols with np.random.zipf (https://en.wikipedia.org/wiki/Zipf's_law)
It's still a toy task, but at least more similar to NLP. We could then debug new networks by starting with the very toy algorithmic tasks, then trying this one, and then moving on to real NLP data. But I'll leave it to you to consider and decide what'd be best. Thanks!

Thank you for the specs, i get to work

@lukaszkaiser This is my implementation(it's not ready for a PR): reverse_generator_nlplike and the test that is almost the same as testReverseGenerator.
Some consideration:

I left the max_length of the sequence as for the reverse task, because we are playing with a toy dataset;
The default standard error is set 1.0 but maybe have a bit of variance will it be better? std=10-20% of the max value(as default value)?
The default alpha of the Zipf's Law is set to 2.0(as used in examples). Unfortunately i haven't find some interesting value to reproduce a text-like distribution but i'have read that to model languages usually is in the range [1.1-1.6].
The Zipf distribution with alpha between [1.0-2.0] produces values that are out of the max token range. I don't find normalization a good idea as suggested in this post but i can run the command until all the values are in the range(bad choice of alpha and/or tokens would never converge with this sanity check).

It looks very good to me, great thanks. I'd set the Zipf's default to 1.5 maybe, judging by what you say. I also think that you need to generate one-by-one the list, or maybe I'm not understanding something in the current code. As you can see in the standard reverse now, we also shift the symbols by 2, because 0 is reserved for padding and 1 for end-of-sequence symbol. So you'd need to do that and add [1] as end-of-sequence (either only to targets or to both inputs and targets, I guess both are fine).
Great thanks for doing this :). I'll close this issue, make a PR and we can finish it there!


useFactory does not exist in type StorageConfig

Just updated to 2.0.0, and when I try to use
IonicStorageModule.forRoot({ useFactory: provideStorage })
I get a compilation error saying
Argument of type '{ useFactory: () => Storage; }' is not assignable to parameter of type 'StorageConfig'. Object literal may only specify known properties, and 'useFactory' does not exist in type 'StorageConfig'.

yeh I get this as well following the comments in the ts file for adding configuration to storage 2.0
This is currently blocking me from updating to latest ionic as storage 2.0.0 is a requirement.

@gnujeremie
comment out that whole export function provideStorage section
Make your imports look like this instead:
  imports: [
    IonicModule.forRoot(MyApp, config),
    IonicStorageModule.forRoot({
      name: '__substreamer3',
     // storeName: '__substreamer3kv',
      driverOrder: ['sqlite', 'websql', 'indexeddb', 'localstorage']
    })
  ],

otherwise follow the 2.0.0 instructions and you're good to go.  Had to dig through the storage.ts file for a bit to find what it was actually expecting to be passed in for config.

@ghenry22  Yes that's what I found out too in the source code too afterwards :)


The example doesn't work (on Heroku)

Can't validate callback URL (/webhook).

@botsbuzz The path in the example is /fb


arrow2_convert primitive (de)serialization performance issues

Serializing and (maybe?) deserializing primitive types through arrow2-convert's APIs is much slower than doing so using raw arrow2 arrays directly.
See #1742 for detailed benchmarks.

Thankfully only really impacts serialization, not deserialization
Need to introduce specialized fast paths for serializing control & component columns that are backed by primitive types, which shouldn't be much of an issue

The fast path for control columns is straightforward and has been added in #1735, although:

We still need a fast path for utf8 (entity_path)
We still need a fast path for timelines & timestamps, but requires #1757 first

The fast path for component columns is much more complicated to get right since everything is erased at that point

Gave it a timeboxed half hour, will have to get back to it later

Closing: we're moving away from arrow2-convert.


Firefox web smoketests do not run at all on Linux

https://github.com/microsoft/vscode/issues/91337#issuecomment-591365093
The issues seem to be vast, not specific to one area.

I am not having enough energy to invest into this. I think our browser is well covered by integration tests (which include Firefox). I will update the smoketest template to only include one browser.


winget list filters missing items

Brief description of your issue
winget list Microsoft.DotNet.DesktopRuntime.8 command result is empty when both x64 and x86 of Microsoft.DotNet.DesktopRuntime.8 are installed
This problem also exists in DotNet6, DotNet7
Steps to reproduce

run winget install -a x64 Microsoft.DotNet.DesktopRuntime.8
run winget list Microsoft.DotNet.DesktopRuntime. Results exists
run winget install --force -a x86 Microsoft.DotNet.DesktopRuntime.8
run winget list. Both x64 and x86 for Microsoft.DotNet.DesktopRuntime.8 are among the results
run winget list Microsoft.DotNet.DesktopRuntime.8. Result is empty

Expected behavior
Both x64 and x86 for Microsoft.DotNet.DesktopRuntime.8 are among the results
Actual behavior
Result is empty
Environment
Windows Package Manager v1.7.10861
Windows: Windows.Desktop v10.0.22631.3374
Package: Microsoft.DesktopAppInstaller v1.22.10861.0

We've been working on the side-by-side scenarios. You could try the latest release and enable the experimental feature on:

https://github.com/microsoft/winget-cli/releases/tag/v1.8.924-preview

Please provide feedback at:

https://github.com/microsoft/winget-cli/discussions/4281


ArgumentException: Could not find MaterialProperty: '_BlendMode', Num properties: 32

Here is the full exception...
ArgumentException: Could not find MaterialProperty: '_BlendMode', Num properties: 32
UnityEditor.ShaderGUI.FindProperty (System.String propertyName, UnityEditor.MaterialProperty[] properties, Boolean propertyIsMandatory) (at /Users/builduser/buildslave/unity/build/Editor/Mono/Inspector/ShaderGUI.cs:47)
UnityEditor.ShaderGUI.FindProperty (System.String propertyName, UnityEditor.MaterialProperty[] properties) (at /Users/builduser/buildslave/unity/build/Editor/Mono/Inspector/ShaderGUI.cs:36)
SpriteShaderGUI.FindProperties (UnityEditor.MaterialProperty[] props) (at Assets/Game/Shaders/Sprites/Editor/SpriteShaderGUI.cs:92)
SpriteShaderGUI.OnGUI (UnityEditor.MaterialEditor materialEditor, UnityEditor.MaterialProperty[] props) (at Assets/Game/Shaders/Sprites/Editor/SpriteShaderGUI.cs:63)
UnityEditor.MaterialEditor.PropertiesGUI () (at /Users/builduser/buildslave/unity/build/Editor/Mono/Inspector/MaterialEditor.cs:1459)
UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)
... known issue? Anyway to work around it? Sorry, total newb when it comes to shaders. TIA!

Hey sorry for the late repsonse, this sounds super weird, are you using an old version of the shaders?
Could you try updating to latest?
It sounds like the ShaderGUI class is mismatched to the actual shaders.


Add a credential provider implementation for OAuth2 clients

Finishes #17

@AlbertoImpl Good idea. The core will be to run ATs in CI using an OAuth2 client for authentication to CF (instead of a username/password) with some specific authorities on the client. OAuth2 authentication is something we should be testing anyway, but it will require some setup on the target CF env after its deployed.


RC-Research Test: Build An Atom 1.7.0-rc.2

@kathy-phet @samreid @KatieWoe, we are ready for the RC research test for Build an Atom. This is the first test, but there were errors while building the sim, thus we are starting at rc.2 This is, as far as I know, the first rc-research test that has been done. We will be using PhET-iO recording to the Metacog backend for this study. With that in mind, please test the following:

Do a full test of Metacog recording
Please lightly test the mirror inputs and state wrappers
ensure that ?showStableUnstableCheckbox=false query parameter works as expected. It should hide the unstable checkbox.
We only need to test the first screen
Use https://phet-dev.colorado.edu/html/build-an-atom/1.7.0-rc.2/phet-io/wrappers/login/?wrapper=record&localFile&showStableUnstableCheckbox=false&validationRule=validateDigits&numberOfDigits=8&screens=1&phetioEmitStates=true&phetioEmitStatesInterval=60 to conduct much of your testing, either entering an 8 digit number, or "phettest" to login. You can also use this link for localFile record and playback.
Conduct whatever base-level of sim testing is needing. A couple platforms, a bit of playing around with the sim. Again you can use the above link to test

Sim link
Wrapper Index

[x]  Latest macOS, Safari only (Time = 1). Max 2 hours.
[x]  Windows 10, Chrome only (Time = 1). Max 2 hours.

There is not yet an rc-research label, otherwise I would add it.
Over to @kathy-phet and @KatieWoe to prioritize.

QA is done

Thanks!


Support null elements in sets

Hello,
I noticed that sets doesn't support null elements.
java.lang.NullPointerException
	at com.github.andrewoma.dexx.collection.internal.hashmap.CompactHashMap.put(CompactHashMap.java:69)
	at com.github.andrewoma.dexx.collection.HashSet.add(HashSet.java:88)
	at com.github.andrewoma.dexx.collection.HashSet.add(HashSet.java:36)
	[...]

java.lang.NullPointerException
	at com.github.andrewoma.dexx.collection.internal.hashmap.CompactHashMap.put(CompactHashMap.java:69)
	at com.github.andrewoma.dexx.collection.HashSet.add(HashSet.java:88)
	at com.github.andrewoma.dexx.collection.Sets.copyOf(Sets.java:133)
	[...]

As there is no @NotNull annotation for it, I assume it is a bug.

I see that this project provide first class support of Kotlin.
So I would like to argue that when using the module kollection from Kotlin the following should either not compile or work.
fun main(args: Array<String>) {
  val set1 = Sets.of(1, 2, null, 3)
  val set2 = set1.add(null)
  set2.forEach { println(it) }
}

And because, it compiles it should work.
Exception in thread "main" java.lang.NullPointerException
	at com.github.andrewoma.dexx.collection.internal.hashmap.CompactHashMap.elemHashCode(CompactHashMap.java:78)
	at com.github.andrewoma.dexx.collection.internal.hashmap.CompactHashMap.computeHash(CompactHashMap.java:89)
	at com.github.andrewoma.dexx.collection.internal.hashmap.CompactHashMap.put(CompactHashMap.java:70)
	at com.github.andrewoma.dexx.collection.HashSet.add(HashSet.java:88)
	at com.github.andrewoma.dexx.collection.HashSet.add(HashSet.java:36)
	at com.github.andrewoma.dexx.collection.Sets.construct(Sets.java:124)
	at com.github.andrewoma.dexx.collection.Sets.of(Sets.java:72)
	at MainKt.main(Main.kt:4)

It's more a limitation at the moment. There's no reason it can't be made to support nulls.
Although it does create a few logical issues around things like SortedSet - should a null come first or last?

It's more a limitation at the moment. There's no reason it can't be made to support nulls.

Sure. But I think from Kotlin it should not compile then. Instead of having a null pointer exception at runtime.

Although it does create a few logical issues around things like SortedSet - should a null come first or last?

I don't see the problem here. First null is not an instance of Comparable. Second, in case of sorted collections, the collection should rely on a comparator and don't care about null value or special sorting the user would want.
Example of factory functions
/** Here elements can be null. But the user have to give a comparator capable handling the elements (which means the user take care of null if the elements are nullable) */
fun <E> emptySortedSet(comparator: Comparator<E>): Set<E>

/** Here the user doesn't have to provide a comparator, but elements have to be comparable. And `null` is not comparable */
fun <E : Comparable<E>> emptySortedSet(): Set<E>

Actually dexx already provide:
fun <E : Any> Sequence<E>.toImmutableSortedSet(selector: (E) -> Comparable<*>?): ImmutableSet<E>

fun <E : Any> immutableCustomSortedSetOf(selector: (E) -> Comparable<*>?, vararg elements: E): ImmutableSet<E>

Beside the naming inconsistency (one is named "custom" but not the other) I dexx actually already answered the question: "should a null come first or last?" and chose to put null first. (it is the behavior of Comparator<E> { e1, e2 -> compareValuesBy(e1, e2, selector) }).


feat!: rm outgoing logs

Still some failing tests... I need to learn a better workflow to test changes more quickly
Remove outgoing logs from aztec.nr.
Remove outgoing note discovery flows from typescript-land.
Outgoing viewing keys are retained, but now aren't used anywhere.

TODO: migration notes and docs

Docs Preview
Hey there! 👋 You can check your preview at https://675782db3ae72849144906cb--aztec-docs-dev.netlify.app

WTF happened to all the tests?! Hahahaha master is so broken!

The tests now fail with Error: Invalid Function Selector length 0 (expected 4) which David supposedly fixes in this PR. Once that gets in I'll merge master again and hopefully it resolves it.


Merge cirq.Pauli.X and cirq.X into one object (do same for Y and Z)

Currently, there is an unnecessary distinction between cirq.Pauli.X (an instance of cirq.Pauli) and cirq.X (an instance of cirq.RotXGate). Some code wants the pauli x, some wants the x rotation. We need to unify these two things into one thing.
I'm not exactly sure how this should be done.
One way would be to introduce a PauliXGate that is the unification of both concepts, and falls back into one or the other as methods are applied (e.g. cirq.X would be a PauliGate but cirq.X**0.5 would again be a RotXGate).
Another way is to destroy the Pauli class and replace it with a type such as Union[cirq.X, cirq.Y, cirq.Z], and all the class methods because just functions that can be applied to that type.
I'm labelling this "good part time project" because I think it's reasonably "meaty" design-wise and amount-of-touched-code-wise. I expect it to require iteration to hit something that works well.

I agree this is a problem, but worry that conflating gates with these other objects, which are really matrices / objects with algebraic relationships is dangerous.
This ties in with our need to represent general matrices for expectation values (pauli string type idea).  I think it is OK if a gate is also one of these objects, but worry that we need to keep these interface designs separate.
I'm not sure this a good part time project, I think this requires some careful thinking that will impact all of Cirq.

"good part time project" is an approximation of "this is a strong bullet point you can add in perf-review as a 20% project". I think this meets that criteria.  Maybe a better name is needed for the tag?
--

worry that conflating gates with these other objects, which are really matrices / objects with algebraic relationships is dangerous

I think, from the user's perspective, these things are fundamentally conflated. And that we should play into that, instead of trying to avoid it, if we can.
For example, have you ever tried to work out when "x^2+1" refers to a function, when it refers to a number, and when it refers to a constraint? Using only syntactic rules? It's hard! This ambiguity is not so great for computers. But in the hands of a human, the ability to play multiple roles and trigger multiple different intuitions is what makes the notation so strong.
Is Pauli X a Hamiltonian or a Unitary? Well, if you multiply it by 6 pi it's definitely a Hamiltonian but if you compute its square root then that's a unitary. If users who want Hamiltonians can simply say cirq.X * 5 instead of cirq.X.as_hamiltonian() * 5, that is a direct win in terms of ease-of-use. Yes, the value cirq.X may start to get a bit hairy as it needs a lot of code for sending things down the right path based on what the user does. But all that complication is in the implementation instead of in the usage.

This is very interesting. Here are my first few thoughts after reading the above.
There are two classes of concepts here: mathematical concepts (e.g. hermitian operator, unitary operator, Clifford gate) and physical concepts (such as the Hamiltonian and the Evolution operator).
The mathematical concepts correspond to sets of operators defined by an algebraic condition (e.g. A=A^H). The physical concepts define roles that mathematical concepts may play if they fulfill certain conditions, e.g. a hermitian operator meets the requirements for an observable such as the Hamiltonian. Unfortunately, the sets of operators defined by the mathematical concepts have non-empty intersection (indeed, the Pauli matrices belong to it) which is why sometimes the physical role of an operator cannot be unambiguously inferred from its mathematical form.
For example, ordinarily it's reasonable to assume a hermitian operator corresponds to an observable and possibly a Hamiltonian but since X is both hermitian and unitary it may in fact be the Evolution operator from a t0 to a t1. The issue is clearly that X is a hermitian operator and also X is a unitary.
I think that it may be possible to express these relationships using a type system. We would define one set of types corresponding to the physical concepts or roles that operators may play and a second set of types for keeping track of algebraic properties such as unitarity.
I think that would strike a reasonable balance between avoiding the risk of conflating objects with different properties and the desire for concise, readable expressions.
Do you know of a reason this won't work? Any caveats I should watch out for? Other thoughts?

That sounds reasonable to me.

Some example use cases that I think should work:
Creating and exponentiating pauli products to create PauliStringPhasor operations that can be put into a circuit:
xy = cirq.X(q) * cirq.Y(p)
sqrt_xy = xy**0.5
c = cirq.Circuit.from_ops(sqrt_xy)

The future possibility of creating linear combinations of pauli products, which defines a QubitOperator (a term from openfermion):
hamiltonian = 0.5 * cirq.X(q) * cirq.Y(p) - cirq.Z(r)

I think it's reasonable to think of the identity as a Pauli in some sense. Mathematica does this, for example. It's an element of the Pauli group and necessary for forming a basis of Hermitian matrices.

I agree that it's a "sort of Pauli" and that it is sometimes thrown in for convenience.

This has been implemented in #1249. Some of the comments above discuss additional features such as linear combinations and products that can be used e.g. to represent hamiltonians.
Linear combinations are covered by #932. Pauli products are covered by #962. Representations of Hamiltonians in cirq is covered by #491.

Clarification on the status of cirq.Pauli: it still exists, but as abstract class. It has no public subclasses and only three instances: cirq.X, cirq.Y and cirq.Z, see #1249.
The class is used in type annotations and for its static methods that enable index-based access to the three instances, e.g. in the definition of SingleQubitCliffordGate class.
In [2]: isinstance(cirq.X, cirq.Pauli)
Out[2]: True

In [3]: isinstance(cirq.T, cirq.Pauli)
Out[3]: False

In [4]: cirq.X == cirq.Pauli.by_index(0)
Out[4]: True

In [5]: cirq.X == cirq.Pauli.by_index(1)
Out[5]: False

In [6]: cirq.Y == cirq.Pauli.by_index(1)
Out[6]: True


How to mention all users in a group chat

I do not know how to mention everyone in a group chat. No errors occurring, just a question.
Microsoft Account
Group Chat
Example of how it may work:
ch = sk.chats["chat_id"]
ch.mention("all") OR ch.mention_all()

Desired outcome: Mentions all users.
Note: I do realize I could simply get all users in a group, then mention them individually, but that would be relatively undesirable compared to mentioning using something like "@all". Thanks for the good work, keep it up!

You'll need to add the markup manually:
<at id="*">all</at>

Thank you!

I still didn't get it. Can I see an example of this, please?

I still didn't get it. Can I see an example of this, please? @Terrance @Kyllingene

An example would be:
from skpy import Skype
sk = Skype(username,password)

chat = sk.chats["chat_id_123"]

chat.sendMsg("<at id="*">all</at> This mentions everyone!", rich=True)


Added the exponentiation operator to the binary operators list - fixe…

…s #1787
I am not really a fan of having to add esnext: true everywhere. But that was the best idea I had. I'm open to suggestions.

You will need to put it in every configure or put it in the beforeAll

:+1: after moving esnext config stuff up a level

Thank you for reviewing :-D
I put the configuration into the beforeEach.
The tests for require-space-before-binary-operators had an issue: it claimed that the option is set to valuebut it was set to [operator]. I fixed that, too.
Same for require-space-after-binary-operators. This test furthermore had the 'should report sticky operator for ' + sticked + ' with true option' test, which is already covered by the (now) first test in the second call of [[operator], true].forEach( . I removed the obsolete test.
I hope my chaotic explanations of this make sense :-)

Now we have esnext: true for all tests. But guess it's fine. LGTM.

Yeah now it's technically not tested with esnext: false anymore but yeah should be ok.

@alawatthe Ok so we noticed npm test was taking long and travis was taking much longer so we're going to revert this for now.
Was getting 14.92s before this PR and 66.93 after

@alawatthe these changes makes our build significantly slower, (10 times slower in fact), we have concerns that it might reflect on real use-cases, so we had to revert it and release without it.
Could you check this what the issue is?

No worries, I agree with reverting the commit. Any ideas how we can make these tests faster? The only one I have is to only enable esnext in those tests, where the operator is ** or **=. I'll update the pull request later today and we'll see if there is a speed up.

The only idea I have is using matrix: http://docs.travis-ci.com/user/customizing-the-build/#Build-Matrix
@hzoo Do we have an issue for speeding up tests?


runtime/race: confusing/legacy comments referring to *.c files that no longer exist

In file runtime/race/race.go there is a legacy comment that was last updated before the C code in the runtime was eliminated. That comment's last update in 2014-09-08 yet announcements for ridding the runtime of C code were made in 2015 https://twitter.com/bradfitz/status/598551393608159233
And in particular the confusing one is:
$ git log | head -n 1 && cat race.go | grep -n race.c
commit 7e1791b97f53bd42808ef2d2e783134b9c3de257
12:// Calls to the runtime are done directly from src/runtime/race.c.

$ cat race.c
cat: race.c: No such file or directory

Altogether there are 2 confusing comments in runtime/race ie
$ grep -R '\w\+\/\w\+\.c' * | cut -d":" -f1 | sort | uniq | grep ".go" | while read F;do git blame $F | grep -n '\w\+\/\w\+\.c';done
12:220a6de4 src/pkg/runtime/race/race.go (Russ Cox        2014-09-08 00:06:45 -0400 12) // Calls to the runtime are done directly from src/runtime/race.c.
22:908e1b5e src/pkg/runtime/race/testdata/select_test.go (Dmitriy Vyukov 2012-11-27 15:04:48 +0400  22) 		// See comment in runtime/chan.c:^selectgo.

Awesome, thanks!


Improving documentation related to the JDK 8

See the discussion here: caelum/vraptor-java8#15

sounds great, @danilomunoz. I just left I few comments.

Done @Turini
Thank you for your help!

awesome!
thank you for spending (investing) time on this, @danilomunoz
merged


getConnectedCameraFeatures() returns invalid CameraSensorConfig

With OAK-D-LITE (one of them without an imu), a call to getConnectedCameraFeatures() returns invalid CameraSensorConfig entries.
There are two config entries for both mono cameras on this device that are impossible. Below is the struct CameraFeatures for one of these mono cameras. We can see this is a camera named "left" (which is a non-color camera since it is always named "color"). We can see its supportedTypes contains only dai::CameraSensorType::MONO. Yet, when we look at dai::CameraFeatures::configs we can see 4 entries...and 2 of them are impossible. These two configs have dai::CameraSensorConfig::type = dai::CameraSensorType::COLOR. That is impossible. We have already proven this "left" dai::CameraSensorType::MONO camera. It is not possible for a MONO camera to have COLOR configs.
The invalid configs also appear with OAK-D-PRO-POE
I do see the depthai-shared comment
/* For some sensors it's not possible to determine if they are color or mono
* (e.g. OV9782 and OV9282), so this could return more than one entry
*/
std::vector<CameraSensorType> supportedTypes;

However supportedTypes contains only one (1) entry of MONO and therefore that comment is moot.
{
    "additionalNames": [],
    "calibrationResolution": {
        "fov": {
            "height": 815.0,
            "width": 1295.0,
            "x": 0.0,
            "y": 0.0
        },
        "height": 800,
        "maxFps":<PHONE_NUMBER>0351563,
        "minFps": 1.687000036239624,
        "type": 1,
        "width": 1280
    },
    "configs": [
        {
            "fov": {
                "height": 720.0,
                "width": 1280.0,
                "x": 0.0,
                "y": 40.0
            },
            "height": 720,
            "maxFps":<PHONE_NUMBER>0351563,
            "minFps": 1.687000036239624,
            "type": 1,
            "width": 1280
        },
        {
            "fov": {
                "height": 720.0,
                "width": 1280.0,
                "x": 0.0,
                "y": 40.0
            },
            "height": 720,
            "maxFps":<PHONE_NUMBER>0351563,
            "minFps": 1.687000036239624,
            "type": 0,
            "width": 1280
        },
        {
            "fov": {
                "height": 800.0,
                "width": 1280.0,
                "x": 0.0,
                "y": 0.0
            },
            "height": 800,
            "maxFps":<PHONE_NUMBER>0351563,
            "minFps": 1.687000036239624,
            "type": 1,
            "width": 1280
        },
        {
            "fov": {
                "height": 800.0,
                "width": 1280.0,
                "x": 0.0,
                "y": 0.0
            },
            "height": 800,
            "maxFps":<PHONE_NUMBER>0351563,
            "minFps": 1.687000036239624,
            "type": 0,
            "width": 1280
        },
        {
            "fov": {
                "height": 800.0,
                "width": 1280.0,
                "x": 0.0,
                "y": 0.0
            },
            "height": 400,
            "maxFps":<PHONE_NUMBER>482422,
            "minFps": 1.687000036239624,
            "type": 1,
            "width": 640
        },
        {
            "fov": {
                "height": 800.0,
                "width": 1280.0,
                "x": 0.0,
                "y": 0.0
            },
            "height": 400,
            "maxFps":<PHONE_NUMBER>482422,
            "minFps": 1.687000036239624,
            "type": 0,
            "width": 640
        }
    ],
    "hasAutofocus": false,
    "hasAutofocusIC": false,
    "height": 800,
    "name": "left",
    "orientation": -1,
    "sensorName": "OV9282",
    "socket": 1,
    "supportedTypes": [
        1
    ],
    "width": 1280
},

@zrezke would you mind taking a look if the recent changes to properly recognize OV9782 on the SR and wide models could be the reason for this?

Not introduced by those changes. But this errant config reporting is fixable for non FFC devices. I will fix it in FW,


Make API generation non interactive

Our ApiGenerator could only be run interactively.
This PR adds proper flags and help and makes the tool non-interactive by default.
In addition to this we switched to async everywhere allowing the tool to be interopted using e.g CTRL+C.

Manually backported to 7.10 and 7.x.
6.x has drifted too far to make backporting this worthwhile.


Communication with PCU works

Description
We want a way to communicate with the PCU to control the hardware periphery and the wakeup feature
What happens if we don't do it (aka Why is it important)?

We cannot dock, power therefore access the hard drive
We cannot wake the BCU after sleep

Definition of Ready
PCU exposes a virtual serial port
Key Tasks
Write functions that transfer commands over the serial port to the PCU

[x] dock, undock
[x] power, unpower
[x] set current time
[x] set wakeup time
[x] power off the bcu

Acceptance Criteria

[x] when we call these functions, the PCU docks and powers.
[x] when we set any of these times, it can be read back correctly
[x] when we set a wakeup time, the supply for the BCU comes back on at the expected time
[ ] when we send the command to power off, we still have enough time to shut down linux before the supply relay opens

cannot tell if the time before power cutoff is long enough because we cannot execute the "shutdown -h now" command yet

Test

had a stopwatch
executed sudo shutdown -h now and started the stopwatch
stopped when power cunsumption decreased significantly (from 300 to around 100mA at 12V)
was aronund 5s

Changed default waiting time from 5 to 10s


📝 Correction | Add Whonix's hidden service address to the page

Description
When I uses Tor browser to access Whonix wiki today, a pop up of tor browser jumped out and inform me that Whonix website can be reached via. hidden service address. Thought it might be great to add a tor hidden service link under the description of Whonix. Here's the address:
http://www.dds6qkxpwdeubwucdiaord2xgbbeyds25rbsgr73tbfpqpt4a6vjwsyd.onion/
Why I am making the suggestion
Just adding information to the Whonix section
My connection with the software
No connection.

[ ] I will keep the issue up-to-date if something I have said changes or I remember a connection with the software.

Do you have a link on the Whonix site where this onion site is linked?

Do you have a link on the Whonix site where this onion site is linked?

I was notified to jump to this onion link by the tor browser.
It's also written on the whonix wiki, too.
Forcing .onion on Whonix.org
http://www.dds6qkxpwdeubwucdiaord2xgbbeyds25rbsgr73tbfpqpt4a6vjwsyd.onion/wiki/Forcing_.onion_on_Whonix.org

Ahh nice, well I'll add it soon!


Label alignment

Can I change the alignment of labels?

@prayuditb
 renderLabel={function (position, stepStatus, label, currentPosition){
         return (
                <Text style={{color: 'black', fontSize: 16, position: 'absolute', left:0}}>{position.label}</Text>
         )
 }}

You can use position absolute with left 0 to fix this issue.

You can also pass labelAlign: 'flex-start' in your customStyles


pfe-modal | On dark band picks up dark broadcast values

Update the broadcast variables for text and links in pfe-modal.

Where the background color is being set on Modal, need to also update the value of the broadcast variables.

I believe this has been resolved: https://patternflyelements.com/elements/pfe-modal/demo/


Review IRQ control in UART code that sleeps

Functions like lpuart_flush and the blocking variants of {lpuart|usart}_write put the MCU to sleep. These function use the macros CRITICAL_SECTION_BEGIN and CRITICAL_SECTION_END to disable IRQs. We need to review whether the use of these macros and the way they are used in those functions is correct.

Fixed.


Feature exlm 96 paths mapping

Please always provide the Jira Issue your PR is for, as well as test URLs where your change can be observed (before and after):
Jira ID: EXLM-96
Test URLs:
Before: https://main--exlm--adobe-experience-league.hlx.page/docs/authoring-guide-exl/using/markdown/cheatsheet
After: https://feature-exlm-96-paths-mapping--exlm--adobe-experience-league.hlx.page/docs/authoring-guide-exl/using/markdown/cheatsheet

Merging to unblock the team.
@Buuhuu Made changes per slack discussion. Updated the content structure in the aem as well.


[FEATURE]  Export or API match data

🚀 feature request
Description
I would like to use match data in external dashboarding services (such as Tableau).
Describe the solution you'd like
Export of all matches of certain player or club (in web UI) OR API documentation to extract it programmatically.
In the network tab I can see some graphQl calls, but i'm not sure how to use them to extract all historic data.
curl 'https://badman.app/graphql' \   -H 'sec-ch-ua: "Not A(Brand";v="99", "Google Chrome";v="121", "Chromium";v="121"' \   -H 'sec-ch-ua-mobile: ?0' \   -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/<IP_ADDRESS> Safari/537.36' \   -H 'Content-Type: application/json' \   -H 'X-App-Magic: 1' \   -H 'Accept: application/json; charset=utf-8' \   -H 'Referer: https://badman.app/player/maxim-verbruggen' \   -H 'sec-ch-ua-platform: "Windows"' \   --data-raw $'{"operationName":"GamesPage_3_S_D_MX","variables":{"id":"61c8abb8-ecdb-4535-ad94-21101897648d","where":{"playedAt":{"$lte":"2024-02-01"},"gameType":{"$in":["S","D","MX"]}},"whereRanking":{"systemId":"934116c8-ee7e-4f3c-9c8b-6de579c3686f"},"order":[{"direction":"desc","field":"playedAt"},{"direction":"desc","field":"id"}],"skip":20,"take":10},"query":"query GamesPage_3_S_D_MX($id: ID\u0021, $where: JSONObject, $whereRanking: JSONObject, $take: Int, $skip: Int,  ....

hi,
I didn't catch the feature request here, I'm working on upgrading the grpahql endpoint so it's easy to fetch the required info you want.
i'll response when it's finished

Great to hear. Any idea on the timeline? Is it something for the coming days or rather months?

@PowerPlop
The endpoint is finally upgraded (had some blocking things for the new enrolments).
You can view the explorer here to build your queries: studio
FYI: for clubs and players you can use the slug as id, this helps for testing things out :)

@PowerPlop
The endpoint is finally upgraded (had some blocking things for the new enrolments). You can view the explorer here to build your queries: studio
FYI: for clubs and players you can use the slug as id, this helps for testing things out :)
Thanks for the effort!
I'm new to graphql, so do you have maybe an example query?

I'm looking for a way to export all games (including players) of a team or a club.
So I tried the Games, Club and Teams endpoint.
Games endpoint
The games endpoint only contains a where  filter/argument? But it's not clear which syntax I should use.
query Games($where: JSONObject, $take: Int) {
  games(where: $where, take: $take) {
    courtId
    set1Team1
    set1Team2
    players {
      firstName
    }
    competition {
      endHour
    }
  }
}

This filter complains that the competition cannot be filtered (ignore the exact filter):
column Game.Competition.EndHour does not exist
{
  "where": { "Competition.EndHour" : "Maxim Verbruggen"},
  "take": 1
}

Filtering on child attributes does work:
{
  "where": { "set1Team1" : "21"},
  "take": 1
}

I see that you use a recentGames endpoint in the badman website, but I don't see that one listed in the studio link?
Team endpoint
Using the Team > Player > Games endpoint, fails with following message: e.getGames is not a function
query Team($teamId: ID!) {
  team(id: $teamId) {
    abbreviation
    players {
      firstName
      fullName
      games {
        playedAt
      }
    }
  }
}

{
  "teamId": "waverse-2g-2023"
}

Player endpoint
The player endpoint works for getting games but is of course not useful for all games of a team.
query Games($playerId: ID!) {
  player(id: $playerId) {
    games {
      set1Team1
    }
  }
}

{
  "playerId": "maxim-verbruggen"
}

hi,
Basically the "where" is a and filter on the keys of that toplevel type (so no deep nesting). if you want dat you can place a second where on that level.
there are some operators available, you can find them here: queryFixer (For example the and operators is configured in line 21 where you can see that we search for $and  in the query)
For getting all games of all your teams I suggest you do the following:

first a query that fetches all your team
Then a query that gets all encounters

query TeamEncounters($where: JSONObject, $take: Int, $order: [SortOrderType!]) {
  encounterCompetitions(where: $where, order: $order, take: $take) {
    rows {
      id
      date
      home {
        id
        name
      }
      away {
        id
        name
      }
      homeScore
      awayScore
      games {
        id
        set1Team1
        set1Team2
        set2Team1
        set2Team2
        set3Team1
        set3Team2
        players {
          id
          fullName
          team
          player
        }
      }
      drawCompetition {
        id
        subEventCompetition {
          id
          eventType
          eventId
        }
      }
    }
  }
}

with the following set of variables, the home and away set of ids should be the same
{
  "where": {
    "$or": [
      {
        "homeTeamId": [] //<your set of ids>
      },
      {
        "awayTeamId":  [] //<your set of ids>
      }
    ]
  },
  "order": [
    {
      "direction": "desc",
      "field": "date"
    }
  ],
  "take": 10
}

note: i'm changing some data layout and the team and player that's part of the games > players  (it's how we know who is playing on which team) is going to be moved in the near future to gameMembership.player and gameMembership.team

hi,
Basically the "where" is a and filter on the keys of that toplevel type (so no deep nesting). if you want dat you can place a second where on that level.
there are some operators available, you can find them here: queryFixer (For example the and operators is configured in line 21 where you can see that we search for $and in the query)
For getting all games of all your teams I suggest you do the following:

first a query that fetches all your team
Then a query that gets all encounters

query TeamEncounters($where: JSONObject, $take: Int, $order: [SortOrderType!]) {
  encounterCompetitions(where: $where, order: $order, take: $take) {
    rows {
      id
      date
      home {
        id
        name
      }
      away {
        id
        name
      }
      homeScore
      awayScore
      games {
        id
        set1Team1
        set1Team2
        set2Team1
        set2Team2
        set3Team1
        set3Team2
        players {
          id
          fullName
          team
          player
        }
      }
      drawCompetition {
        id
        subEventCompetition {
          id
          eventType
          eventId
        }
      }
    }
  }
}

with the following set of variables, the home and away set of ids should be the same
{
  "where": {
    "$or": [
      {
        "homeTeamId": [] //<your set of ids>
      },
      {
        "awayTeamId":  [] //<your set of ids>
      }
    ]
  },
  "order": [
    {
      "direction": "desc",
      "field": "date"
    }
  ],
  "take": 10
}

note: i'm changing some data layout and the team and player that's part of the games > players (it's how we know who is playing on which team) is going to be moved in the near future to gameMembership.player and gameMembership.team

Works perfectly, thanks!
Next job is getting ranking points for each match.

You should be able to fetch this via the single/double/mix property (which will also be moved) in (near) feature release (!)
query TeamEncounters($where: JSONObject, $take: Int, $order: [SortOrderType!]) {
  encounterCompetitions(where: $where, order: $order, take: $take) {
    rows {
     # ... existing
      games {
        # ... existing
        players {
          id
          fullName
          team
          player
         # new stuff
         single
         double
         mix
         # done new stuff
        }
      }
    }
  }
}

@cskiwi Worked perfectly, thanks for all the information and help.
In case you would be interested, I built a tableau dashboard based on the badman data: Tableau link


Celo:

Describe your issue here.
Hello! I have an issue depositing CUSD to my account. Transaction has been approved and successfully finished more then 3 hours ago, however no tokens credited my wallet and no record on successful depositing is available. TxID: 0x36a12410e4076a6972cd8b5a15f3a73c6599709d75f512bc18d00d720a6b648a. My CUSD wallet address is 0x099629642247C969D47f262EFDC643F2D9DC5796
Environment

Elixir Version: 1.12.3

Erlang Version: 24

BlockScout Version: 572759d11da8815bae1837bbf93c8e00743c9bb6

User Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36 OPR/86.0.4363.50

Steps to reproduce
Tell us how to reproduce this issue. If possible, push up a branch to your fork with a regression test we can run to reproduce locally.
Expected Behaviour
Tell us what should happen.
Actual Behaviour
Tell us what happens instead.

Be Advised no Admin or team will ever DM you or share you any link so you can only chat Here on Live Chat with Celo Agent  On LIVE SUPPORTLIVE CHAT


WIP: UTY-1363: Use SchemaObject.IndexObject instead of GetObject to remove duplicate events

Contributions: We are not currently taking public contributions - see our contributions policy. However, we are accepting issues and we do want your feedback.

Description
Use SchemaObject.IndexObject to retrieve all events if multiple events are received as part of the same component update. SchemaObject.GetObject only gives you the last element in a repeated proto object (according to Sami and David) leading to us retrieving the last event multiple times.
Tests
Manual tests. I'm not aware of a way to test this nicely at a unit test level. Help appreciated.
Documentation
As far as I understand we don't do explicit release/bugfix notes atm.
Primary reviewers
@samiwh @mattyoung-improbable

Investigations to see whether this bug is repeated elsewhere are pending.


BREAKING: create generic engine.OutputOpenAPISpec for use in all engines

This pulls out as much functionality as possible in regards to generating the assets when calling engine.OutputOpenApiSpec.
This change is breaking in so far as the OpenAPIConfig will be composed of EngineOpenAPIConfig. I personally don't like these names but I want to ask about changing it here first. I would prefer that we change OpenAPIConfig to ServerOpenAPIConfig and EngineOpenAPIConfig becomes the OpenAPIConfig. The current OpenAPIConfig does have some uniqueness in regards to the fuego.Server. We probably could consolidate nearly all of it though if in #260 we created an interface that dealt with route/url registration, but I'm not sure how far we want to take this. Or if someone can think of a better name for EngineOpenAPIConfig.
For instance every framework we bring in would need to be able to handle something like this to make it work
// OutputOpenAPISpec takes the OpenAPI spec and outputs it to a JSON file and/or serves it on a URL.
// Also serves a Swagger UI.
// To modify its behavior, use the [WithOpenAPIConfig] option.
func (s *Server) OutputOpenAPISpec() openapi3.T {
	s.OpenAPI.Description().Servers = append(s.OpenAPI.Description().Servers, &openapi3.Server{
		URL:         s.url(),
		Description: "local server",
	})

	if !s.OpenAPIConfig.DisableSwagger {
		s.registerOpenAPIRoutes(s.Engine.OutputOpenApiSpec())
	}

	return *s.OpenAPI.Description()
}

// Registers the routes to serve the OpenAPI spec and Swagger UI.
func (s *Server) registerOpenAPIRoutes(jsonSpec []byte) {
	GetStd(s, s.OpenAPIConfig.JsonUrl, func(w http.ResponseWriter, r *http.Request) {
		w.Header().Set("Content-Type", "application/json")
		_, _ = w.Write(jsonSpec)
	})
	s.printOpenAPIMessage(fmt.Sprintf("JSON spec: %s%s", s.url(), s.OpenAPIConfig.JsonUrl))

	if !s.OpenAPIConfig.DisableSwaggerUI {
		Register(s, Route[any, any]{
			BaseRoute: BaseRoute{
				Method: http.MethodGet,
				Path:   s.OpenAPIConfig.SwaggerUrl + "/",
			},
		}, s.OpenAPIConfig.UIHandler(s.OpenAPIConfig.JsonUrl))
		s.printOpenAPIMessage(fmt.Sprintf("OpenAPI UI: %s%s/index.html", s.url(), s.OpenAPIConfig.SwaggerUrl))
	}
}

Assuming this is acceptable. I believe really the decisions regarding how far we take this will be based on how far we want to take #260.

Nice PR! We just need to de-embed the OpenAPIServerConfig field.

I thought 84ee2ff566fa8faa148e8ff10196956c0afc109b would come with a change on the struct to de-embed it really. Here you de-embedded the way the embedded struct is called.
But maybe I'm missing something

I thought https://github.com/go-fuego/fuego/commit/84ee2ff566fa8faa148e8ff10196956c0afc109b would come with a change on the struct to de-embed it really. Here you de-embedded the way the embedded struct is called.

Maybe I'm just misunderstanding the ask. I assumed @EwenQuim just wanted it to be structured the way OpenAPIConfig originally was.

No, you are fine. I'm sorry. I missed the fact you de-embedded at the struct level


Initial checkin new TDI python cli to interfaces with new TDI c_front…

Passed the following testing cases (detail please refer to unit testing/integration testing plan documents).

Python CLI has been initialized successfully with new TDI libtdi.so (contains all c_frontend APIs). Passed.
The DPDK target has been initialized (passed)
The load tdi.json file (for simple_l2l3.p4 program).
The MatchActionTables: The meta data are populated for P4 related tables: ipv4_host, ipv4_lpm, l2_fwd and mymac meta data
are display correctly.
Fixed Table Entry testing cases:
5.1 add the PortCfg Table and verify the log to see the pipeline manager is populated correctly.
5.2 get the PortStatTable for all the port counters (rx_bytes, rx_packets, tx_bytes, tx_packets and etc).
P4 Tables Entry Testing cases:
6.1 Add entry for match action ex. ipv4_host (exactly matching).
6.2. Get entry for match action.
6.3 delete entry for Match action.
6.4 modify the entry for MatchAction table.