Add gates for enterprise, debuggability, testing, and adoption. (#2701)
This commit is contained in:
Родитель
07f4498ae5
Коммит
8e147a4e21
|
@ -249,11 +249,15 @@ class ApprovalConfigsAPITest(testing_config.CustomTestCase):
|
|||
core_enums.GATE_API_ORIGIN_TRIAL: ['owner@example.com'],
|
||||
core_enums.GATE_API_EXTEND_ORIGIN_TRIAL: ['owner@example.com'],
|
||||
core_enums.GATE_API_SHIP: ['owner@example.com'],
|
||||
core_enums.GATE_ADOPTION_SHIP: ['owner@example.com'],
|
||||
core_enums.GATE_PRIVACY_ORIGIN_TRIAL: ['owner@example.com'],
|
||||
core_enums.GATE_PRIVACY_SHIP: ['owner@example.com'],
|
||||
core_enums.GATE_SECURITY_ORIGIN_TRIAL: ['owner@example.com'],
|
||||
core_enums.GATE_SECURITY_SHIP: ['owner@example.com'],
|
||||
core_enums.GATE_ENTERPRISE_SHIP: ['owner@example.com'],
|
||||
core_enums.GATE_DEBUGGABILITY_ORIGIN_TRIAL: ['owner@example.com'],
|
||||
core_enums.GATE_DEBUGGABILITY_SHIP: ['owner@example.com'],
|
||||
core_enums.GATE_TESTING_SHIP: ['owner@example.com'],
|
||||
core_enums.GATE_ADOPTION_SHIP: ['owner@example.com'],
|
||||
}
|
||||
|
||||
def setUp(self):
|
||||
|
|
|
@ -84,6 +84,12 @@ export class ChromedashGateColumn extends LitElement {
|
|||
border-radius: var(--border-radius);
|
||||
background: var(--table-alternate-background);
|
||||
}
|
||||
#questionnaire ul {
|
||||
padding-left: 1em;
|
||||
}
|
||||
#questionnaire li {
|
||||
list-style: disc;
|
||||
}
|
||||
.instructions {
|
||||
padding: var(--content-padding-half);
|
||||
margin-bottom: var(--content-padding-large);
|
||||
|
@ -504,9 +510,11 @@ export class ChromedashGateColumn extends LitElement {
|
|||
renderQuestionnaire() {
|
||||
const questionnaireText = GATE_QUESTIONNAIRES[this.gate.gate_type];
|
||||
if (!questionnaireText) return nothing;
|
||||
const markup = (typeof questionnaireText == 'string') ?
|
||||
autolink(questionnaireText) : questionnaireText;
|
||||
return html`
|
||||
<h2>Survey questions</h2>
|
||||
<div id="questionnaire">${autolink(questionnaireText)}</div>
|
||||
<div id="questionnaire">${markup}</div>
|
||||
<p class="instructions">
|
||||
Please post responses in the comments below.
|
||||
</p>
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
import {html} from 'lit';
|
||||
import {
|
||||
FEATURE_TYPES,
|
||||
IMPLEMENTATION_STATUS,
|
||||
|
@ -700,18 +701,79 @@ const BLINK_GENERIC_QUESTIONNAIRE = (
|
|||
);
|
||||
|
||||
const ADOPTION_GENERIC_QUESTIONNAIRE = (
|
||||
'To request a review, use the "Request review" button ' +
|
||||
'above.'
|
||||
`To request a review, use the "Request review" button above.`
|
||||
);
|
||||
|
||||
const PRIVACY_GENERIC_QUESTIONNAIRE = (
|
||||
'To request a review, use the "Request review" button ' +
|
||||
'above.'
|
||||
`To request a review, use the "Request review" button above.`
|
||||
);
|
||||
|
||||
const SECURITY_GENERIC_QUESTIONNAIRE = (
|
||||
'To request a review, use the "Request review" button ' +
|
||||
'above.'
|
||||
`To request a review, use the "Request review" button above.`
|
||||
);
|
||||
|
||||
const ENTERPRISE_SHIP_QUESTIONNAIRE = (
|
||||
html`<b>(1) Does this launch include a breaking change?</b>
|
||||
Does this launch remove or modify existing behavior or does it interrupt an existing user flow? (e.g. removing or restricting an API, or significant UI change). Answer with one of the following options, and/or describe anything you're unsure about:
|
||||
<ul>
|
||||
<li>No. There's no change visible to users, developers, or IT admins (e.g. internal refactoring)
|
||||
<li>No. This launch is strictly additive functionality
|
||||
<li>Yes. Something that exists is changing or being removed (even if usage is very small)
|
||||
<li>I don't know. Enterprise reviewers, please help me decide. The relevant information is: ______
|
||||
</ul>
|
||||
<b>(2) Is there any other reason you expect that enterprises will care about this launch?</b>
|
||||
(e.g. they may perceive a risk of data leaks if the browser is uploading new information, or it may be a surprise to employees resulting in them calling their help desk). Answer with one of the following options, and/or describe anything you're unsure about:
|
||||
<ul>
|
||||
<li>No. Enterprises won't care about this
|
||||
<li>Yes. They'll probably care because ______
|
||||
<li>I don't know. Enterprise reviewers, please help me decide. The relevant information is: ______
|
||||
</ul>
|
||||
<b>(3) Does your launch have an enterprise policy to control it, and will it be available when this rolls out to stable (even to 1%)?</b>
|
||||
Only required if you answered Yes to either of the first 2 questions. Answer with one of the following options, and/or describe anything you're unsure about:
|
||||
<ul>
|
||||
<li>Yes. It's called ______. It will be a permanent policy, and it will be available when stable rollout starts
|
||||
<li>Yes. It's called ______. This is a temporary transition period, so the policy will stop working on milestone ___. It will be available when stable rollout starts
|
||||
<li>No. A policy is infeasible because ______ (e.g. this launch is a change in how we compile Chrome)
|
||||
<li>No. A policy isn't necessary because ______ (e.g. there's a better method of control available to admins)
|
||||
</ul>
|
||||
<b>(4) Provide a brief title and description of this launch, which can be shared with enterprises.</b>
|
||||
Only required if you answered Yes to either of the first 2 questions. This may be added to browser release notes. Where applicable, explain the benefit to users, and describe the policy to control it.
|
||||
`
|
||||
);
|
||||
|
||||
const DEBUGGABILITY_ORIGIN_TRIAL_QUESTIONNAIRE = (
|
||||
`(1) Does the introduction of the new Web Platform feature break Chrome DevTools' existing developer experience?
|
||||
|
||||
(2) Does Chrome DevTools' existing set of tooling features interact with the new Web Platform feature in an expected way?
|
||||
|
||||
(3) Would the new Web Platform feature's acceptance and/or adoption benefit from adding a new developer workflow to Chrome DevTools?
|
||||
|
||||
When in doubt, please check out https://goo.gle/devtools-checklist for details!
|
||||
`
|
||||
);
|
||||
|
||||
const DEBUGGABILITY_SHIP_QUESTIONNAIRE = DEBUGGABILITY_ORIGIN_TRIAL_QUESTIONNAIRE;
|
||||
|
||||
const TESTING_SHIP_QUESTIONNAIRE = (
|
||||
'See http://go/chrome-wp-test-survey.'
|
||||
);
|
||||
|
||||
const ADOPTION_SHIP_QUESTIONNAIRE = (
|
||||
html`<b>(1) What is your availability expectation for this feature?</b>
|
||||
Examples:<ul>
|
||||
<li>Feature x is available on Web Platform mainline within 12 month of launch in Chrome
|
||||
<li>Feature x is available in Chromium browsers for the foreseeable future
|
||||
</ul>
|
||||
<b>(2) What is your adoption expectation for this feature?</b>
|
||||
Examples:<ul>
|
||||
<li>Feature x is considered a best practice for use case y within 12 month of reaching Web Platform baseline
|
||||
<li>Feature x is used by partner y to provide functionality z within 12 month of launch in Chrome
|
||||
<li>At least 3 major abstractions replace their use of feature y with feature x within 24 months of reaching mainline.
|
||||
</ul>
|
||||
<b>(3) What is the plan to achieve the stated expectations?</b>
|
||||
Please provide a plan that covers availability and adoption planning for the feature.
|
||||
|
||||
`
|
||||
);
|
||||
|
||||
|
||||
|
@ -725,4 +787,10 @@ export const GATE_QUESTIONNAIRES = {
|
|||
[GATE_TYPES.PRIVACY_SHIP]: PRIVACY_GENERIC_QUESTIONNAIRE,
|
||||
[GATE_TYPES.SECURITY_ORIGIN_TRIAL]: SECURITY_GENERIC_QUESTIONNAIRE,
|
||||
[GATE_TYPES.SECURITY_SHIP]: SECURITY_GENERIC_QUESTIONNAIRE,
|
||||
[GATE_TYPES.ENTERPRISE_SHIP]: ENTERPRISE_SHIP_QUESTIONNAIRE,
|
||||
[GATE_TYPES.DEBUGGABILITY_ORIGIN_TRIAL]:
|
||||
DEBUGGABILITY_ORIGIN_TRIAL_QUESTIONNAIRE,
|
||||
[GATE_TYPES.DEBUGGABILITY_SHIP]: DEBUGGABILITY_SHIP_QUESTIONNAIRE,
|
||||
[GATE_TYPES.TESTING_SHIP]: TESTING_SHIP_QUESTIONNAIRE,
|
||||
[GATE_TYPES.ADOPTION_SHIP]: ADOPTION_SHIP_QUESTIONNAIRE,
|
||||
};
|
||||
|
|
|
@ -139,15 +139,21 @@ export const GATE_TYPES = {
|
|||
API_ORIGIN_TRIAL: 2,
|
||||
API_EXTEND_ORIGIN_TRIAL: 3,
|
||||
API_SHIP: 4,
|
||||
ADOPTION_SHIP: 14,
|
||||
PRIVACY_ORIGIN_TRIAL: 32,
|
||||
PRIVACY_SHIP: 34,
|
||||
SECURITY_ORIGIN_TRIAL: 42,
|
||||
SECURITY_SHIP: 44,
|
||||
|
||||
ENTERPRISE_SHIP: 54,
|
||||
DEBUGGABILITY_ORIGIN_TRIAL: 62,
|
||||
DEBUGGABILITY_SHIP: 64,
|
||||
TESTING_SHIP: 74,
|
||||
ADOPTION_SHIP: 84,
|
||||
};
|
||||
|
||||
export const GATE_TEAM_ORDER = [
|
||||
'Adoption', 'Privacy', 'Security', 'Testing', 'API Owners'];
|
||||
'Privacy', 'Security', 'Enterprise', 'Debuggability',
|
||||
'Testing', 'Adoption', 'API Owners'];
|
||||
|
||||
|
||||
export const OT_MILESTONE_END_FIELDS = {
|
||||
|
|
|
@ -67,12 +67,6 @@ ShipApproval = ApprovalFieldDef(
|
|||
'Three API Owners must approve your intent',
|
||||
core_enums.GATE_API_SHIP, THREE_LGTM)
|
||||
|
||||
AdoptionShipApproval = ApprovalFieldDef(
|
||||
'Adoption review',
|
||||
'Adoption review',
|
||||
core_enums.GATE_ADOPTION_SHIP, ONE_LGTM,
|
||||
team_name='Adoption')
|
||||
|
||||
PrivacyOriginTrialApproval = ApprovalFieldDef(
|
||||
'Privacy OT Review',
|
||||
'Privacy OT Review',
|
||||
|
@ -97,6 +91,36 @@ SecurityShipApproval = ApprovalFieldDef(
|
|||
core_enums.GATE_SECURITY_SHIP, ONE_LGTM,
|
||||
team_name='Security')
|
||||
|
||||
EnterpriseShipApproval = ApprovalFieldDef(
|
||||
'Enterprise Ship Review',
|
||||
'Enterprise Ship Review',
|
||||
core_enums.GATE_ENTERPRISE_SHIP, ONE_LGTM,
|
||||
team_name='Enterprise')
|
||||
|
||||
DebuggabilityOriginTrialApproval = ApprovalFieldDef(
|
||||
'Debuggability OT Review',
|
||||
'Debuggability OT Review',
|
||||
core_enums.GATE_DEBUGGABILITY_ORIGIN_TRIAL, ONE_LGTM,
|
||||
team_name='Debuggability')
|
||||
|
||||
DebuggabilityShipApproval = ApprovalFieldDef(
|
||||
'Debuggability Ship Review',
|
||||
'Debuggability Ship Review',
|
||||
core_enums.GATE_DEBUGGABILITY_SHIP, ONE_LGTM,
|
||||
team_name='Debuggability')
|
||||
|
||||
TestingShipApproval = ApprovalFieldDef(
|
||||
'Testing Ship Review',
|
||||
'Testing Ship Review',
|
||||
core_enums.GATE_TESTING_SHIP, ONE_LGTM,
|
||||
team_name='Testing')
|
||||
|
||||
AdoptionShipApproval = ApprovalFieldDef(
|
||||
'Adoption Ship Review',
|
||||
'Adoption Ship Review',
|
||||
core_enums.GATE_ADOPTION_SHIP, ONE_LGTM,
|
||||
team_name='Adoption')
|
||||
|
||||
APPROVAL_FIELDS_BY_ID = {
|
||||
afd.field_id: afd
|
||||
for afd in [
|
||||
|
@ -105,6 +129,10 @@ APPROVAL_FIELDS_BY_ID = {
|
|||
AdoptionShipApproval,
|
||||
PrivacyOriginTrialApproval, PrivacyShipApproval,
|
||||
SecurityOriginTrialApproval, SecurityShipApproval,
|
||||
EnterpriseShipApproval,
|
||||
DebuggabilityOriginTrialApproval, DebuggabilityShipApproval,
|
||||
TestingShipApproval,
|
||||
AdoptionShipApproval,
|
||||
]
|
||||
}
|
||||
|
||||
|
|
|
@ -244,42 +244,65 @@ GATE_API_PROTOTYPE = 1
|
|||
GATE_API_ORIGIN_TRIAL = 2
|
||||
GATE_API_EXTEND_ORIGIN_TRIAL = 3
|
||||
GATE_API_SHIP = 4
|
||||
GATE_ADOPTION_SHIP = 14
|
||||
GATE_PRIVACY_ORIGIN_TRIAL = 32
|
||||
GATE_PRIVACY_SHIP = 34
|
||||
GATE_SECURITY_ORIGIN_TRIAL = 42
|
||||
GATE_SECURITY_SHIP = 44
|
||||
GATE_ENTERPRISE_SHIP = 54
|
||||
GATE_DEBUGGABILITY_ORIGIN_TRIAL = 62
|
||||
GATE_DEBUGGABILITY_SHIP = 64
|
||||
GATE_TESTING_SHIP = 74
|
||||
GATE_ADOPTION_SHIP = 84
|
||||
|
||||
# @@@ Add multiple gates to constant below and update guide.py to add a loop.
|
||||
|
||||
# List of (stage type, gate type) for each feature type.
|
||||
STAGES_AND_GATES_BY_FEATURE_TYPE: dict[int, list[tuple[int, Optional[int]]]] = {
|
||||
STAGES_AND_GATES_BY_FEATURE_TYPE: dict[int, list[tuple[int, list[int]]]] = {
|
||||
FEATURE_TYPE_INCUBATE_ID: [
|
||||
(STAGE_BLINK_INCUBATE, None),
|
||||
(STAGE_BLINK_PROTOTYPE, GATE_API_PROTOTYPE),
|
||||
(STAGE_BLINK_DEV_TRIAL, None),
|
||||
(STAGE_BLINK_EVAL_READINESS, None),
|
||||
(STAGE_BLINK_ORIGIN_TRIAL, GATE_API_ORIGIN_TRIAL),
|
||||
(STAGE_BLINK_EXTEND_ORIGIN_TRIAL, GATE_API_EXTEND_ORIGIN_TRIAL),
|
||||
(STAGE_BLINK_SHIPPING, GATE_API_SHIP)],
|
||||
(STAGE_BLINK_INCUBATE, []),
|
||||
(STAGE_BLINK_PROTOTYPE, [GATE_API_PROTOTYPE]),
|
||||
(STAGE_BLINK_DEV_TRIAL, []),
|
||||
(STAGE_BLINK_EVAL_READINESS, []),
|
||||
(STAGE_BLINK_ORIGIN_TRIAL,
|
||||
[GATE_DEBUGGABILITY_ORIGIN_TRIAL,
|
||||
GATE_API_ORIGIN_TRIAL]),
|
||||
(STAGE_BLINK_EXTEND_ORIGIN_TRIAL, [GATE_API_EXTEND_ORIGIN_TRIAL]),
|
||||
(STAGE_BLINK_SHIPPING,
|
||||
[GATE_PRIVACY_SHIP, GATE_SECURITY_SHIP, GATE_ENTERPRISE_SHIP,
|
||||
GATE_DEBUGGABILITY_SHIP, GATE_TESTING_SHIP, GATE_ADOPTION_SHIP,
|
||||
GATE_API_SHIP])],
|
||||
FEATURE_TYPE_EXISTING_ID: [
|
||||
(STAGE_FAST_PROTOTYPE, GATE_API_PROTOTYPE),
|
||||
(STAGE_FAST_DEV_TRIAL, None),
|
||||
(STAGE_FAST_ORIGIN_TRIAL, GATE_API_ORIGIN_TRIAL),
|
||||
(STAGE_FAST_EXTEND_ORIGIN_TRIAL, GATE_API_EXTEND_ORIGIN_TRIAL),
|
||||
(STAGE_FAST_SHIPPING, GATE_API_SHIP)],
|
||||
(STAGE_FAST_PROTOTYPE, [GATE_API_PROTOTYPE]),
|
||||
(STAGE_FAST_DEV_TRIAL, []),
|
||||
(STAGE_FAST_ORIGIN_TRIAL,
|
||||
[GATE_DEBUGGABILITY_ORIGIN_TRIAL,
|
||||
GATE_API_ORIGIN_TRIAL]),
|
||||
(STAGE_FAST_EXTEND_ORIGIN_TRIAL, [GATE_API_EXTEND_ORIGIN_TRIAL]),
|
||||
(STAGE_FAST_SHIPPING,
|
||||
[GATE_PRIVACY_SHIP, GATE_SECURITY_SHIP, GATE_ENTERPRISE_SHIP,
|
||||
GATE_DEBUGGABILITY_SHIP, GATE_TESTING_SHIP, GATE_ADOPTION_SHIP,
|
||||
GATE_API_SHIP])],
|
||||
FEATURE_TYPE_CODE_CHANGE_ID: [
|
||||
(STAGE_PSA_IMPLEMENT, GATE_API_PROTOTYPE),
|
||||
(STAGE_PSA_DEV_TRIAL, None),
|
||||
(STAGE_PSA_SHIPPING, GATE_API_SHIP)],
|
||||
(STAGE_PSA_IMPLEMENT, [GATE_API_PROTOTYPE]),
|
||||
(STAGE_PSA_DEV_TRIAL, []),
|
||||
(STAGE_PSA_SHIPPING,
|
||||
[GATE_PRIVACY_SHIP, GATE_SECURITY_SHIP, GATE_ENTERPRISE_SHIP,
|
||||
GATE_DEBUGGABILITY_SHIP, GATE_TESTING_SHIP, GATE_ADOPTION_SHIP,
|
||||
GATE_API_SHIP])],
|
||||
FEATURE_TYPE_DEPRECATION_ID: [
|
||||
(STAGE_DEP_PLAN, None),
|
||||
(STAGE_DEP_DEV_TRIAL, None),
|
||||
(STAGE_DEP_DEPRECATION_TRIAL, GATE_API_ORIGIN_TRIAL),
|
||||
(STAGE_DEP_EXTEND_DEPRECATION_TRIAL, GATE_API_EXTEND_ORIGIN_TRIAL),
|
||||
(STAGE_DEP_SHIPPING, GATE_API_SHIP),
|
||||
(STAGE_DEP_REMOVE_CODE, None)],
|
||||
(STAGE_DEP_PLAN, []),
|
||||
(STAGE_DEP_DEV_TRIAL, []),
|
||||
(STAGE_DEP_DEPRECATION_TRIAL,
|
||||
[GATE_DEBUGGABILITY_ORIGIN_TRIAL,
|
||||
GATE_API_ORIGIN_TRIAL]),
|
||||
(STAGE_DEP_EXTEND_DEPRECATION_TRIAL, [GATE_API_EXTEND_ORIGIN_TRIAL]),
|
||||
(STAGE_DEP_SHIPPING,
|
||||
[GATE_PRIVACY_SHIP, GATE_SECURITY_SHIP, GATE_ENTERPRISE_SHIP,
|
||||
GATE_DEBUGGABILITY_SHIP, GATE_TESTING_SHIP, GATE_ADOPTION_SHIP,
|
||||
GATE_API_SHIP]),
|
||||
(STAGE_DEP_REMOVE_CODE, [])],
|
||||
FEATURE_TYPE_ENTERPRISE_ID: [
|
||||
(STAGE_ENT_ROLLOUT, None)]
|
||||
(STAGE_ENT_ROLLOUT, [])]
|
||||
}
|
||||
|
||||
# Prototype stage types for every feature type.
|
||||
|
|
|
@ -108,15 +108,15 @@ class FeatureCreateHandler(basehandlers.FlaskHandler):
|
|||
# Obtain a list of stages and gates for the given feature type.
|
||||
stages_gates = core_enums.STAGES_AND_GATES_BY_FEATURE_TYPE[feature_type]
|
||||
|
||||
for stage_type, gate_type in stages_gates:
|
||||
for stage_type, gate_types in stages_gates:
|
||||
# Don't create a trial extension stage pre-emptively.
|
||||
if stage_type == core_enums.STAGE_TYPES_EXTEND_ORIGIN_TRIAL[feature_type]:
|
||||
continue
|
||||
|
||||
stage = Stage(feature_id=feature_id, stage_type=stage_type)
|
||||
stage.put()
|
||||
# Not all stages have gates. If a gate is specified, create it.
|
||||
if gate_type:
|
||||
# Stages can have zero or more gates.
|
||||
for gate_type in gate_types:
|
||||
gate = Gate(feature_id=feature_id, stage_id=stage.key.integer_id(),
|
||||
gate_type=gate_type, state=Gate.PREPARING)
|
||||
gate.put()
|
||||
|
|
|
@ -100,7 +100,7 @@ class FeatureCreateTest(testing_config.CustomTestCase):
|
|||
stages = Stage.query().fetch()
|
||||
gates = Gate.query().fetch()
|
||||
self.assertEqual(len(stages), 6)
|
||||
self.assertEqual(len(gates), 3)
|
||||
self.assertEqual(len(gates), 10)
|
||||
|
||||
|
||||
class FeatureEditHandlerTest(testing_config.CustomTestCase):
|
||||
|
|
Загрузка…
Ссылка в новой задаче