Skip to content

Commit

Permalink
Add roles for questionnaire/assessment/archetype
Browse files Browse the repository at this point in the history
Signed-off-by: Sam Lucidi <slucidi@redhat.com>
  • Loading branch information
mansam committed Sep 20, 2023
1 parent 2135b7a commit 6e7290a
Show file tree
Hide file tree
Showing 5 changed files with 134 additions and 14 deletions.
1 change: 0 additions & 1 deletion api/archetype.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ const (
ArchetypesRoot = "/archetypes"
ArchetypeRoot = ArchetypesRoot + "/:" + ID
ArchetypeAssessmentsRoot = ArchetypeRoot + "/assessments"
ArchetypeAssessmentRoot = ArchetypeAssessmentsRoot + ":/" + ID2
)

//
Expand Down
10 changes: 6 additions & 4 deletions api/assessment.go
Original file line number Diff line number Diff line change
Expand Up @@ -170,15 +170,16 @@ type Assessment struct {
Resource
Application *Ref `json:"application,omitempty" yaml:",omitempty" binding:"excluded_with=Archetype"`
Archetype *Ref `json:"archetype,omitempty" yaml:",omitempty" binding:"excluded_with=Application"`
Questionnaire Ref `json:"questionnaire" yaml:"questionnaire" binding:"required"`
Sections []assessment.Section `json:"sections" yaml:"sections"`
Questionnaire Ref `json:"questionnaire" binding:"required"`
Sections []assessment.Section `json:"sections"`
Stakeholders []Ref `json:"stakeholders"`
StakeholderGroups []Ref `json:"stakeholderGroups"`
// read only
Risk string `json:"risk"`
Confidence int `json:"confidence"`
Status string `json:"status"`
Thresholds assessment.Thresholds `json:"thresholds" yaml:"thresholds"`
RiskMessages assessment.RiskMessages `json:"riskMessages" yaml:"riskMessages"`
Thresholds assessment.Thresholds `json:"thresholds"`
RiskMessages assessment.RiskMessages `json:"riskMessages"`
}

//
Expand Down Expand Up @@ -211,6 +212,7 @@ func (r *Assessment) With(m *model.Assessment) {
r.Status = AssessmentEmpty
}
r.Risk = r.RiskLevel()
r.Confidence = assessment.Confidence(r.Sections)
}

//
Expand Down
70 changes: 70 additions & 0 deletions assessment/pkg.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,78 @@ package assessment
import (
"encoding/json"
"github.com/konveyor/tackle2-hub/model"
"math"
)

//
// Assessment risk
const (
RiskUnknown = "unknown"
RiskRed = "red"
RiskYellow = "yellow"
RiskGreen = "green"
)

//
// Confidence adjustment
const (
AdjusterRed = 0.5
AdjusterYellow = 0.98
)

//
// Confidence multiplier.
const (
MultiplierRed = 0.6
MultiplierYellow = 0.95
)

//
// Risk weights
const (
WeightRed = 1
WeightYellow = 80
WeightGreen = 100
WeightUnknown = 70
)

//
// Confidence calculates a confidence score based on the answers to an assessment's questions.
// The algorithm is a reimplementation of the calculation done by Pathfinder.
func Confidence(sections []Section) (score int) {
totalQuestions := 0
riskCounts := make(map[string]int)
for _, s := range sections {
for _, r := range s.Risks() {
riskCounts[r]++
totalQuestions++
}
}
adjuster := 1.0
if riskCounts[RiskRed] > 0 {
adjuster = adjuster * math.Pow(AdjusterRed, float64(riskCounts[RiskRed]))
}
if riskCounts[RiskYellow] > 0 {
adjuster = adjuster * math.Pow(AdjusterYellow, float64(riskCounts[RiskYellow]))
}
confidence := 0.0
for i := 0; i < riskCounts[RiskRed]; i++ {
confidence *= MultiplierRed
confidence += WeightRed * adjuster
}
for i := 0; i < riskCounts[RiskYellow]; i++ {
confidence *= MultiplierYellow
confidence += WeightYellow * adjuster
}
confidence += float64(riskCounts[RiskGreen]) * WeightGreen * adjuster
confidence += float64(riskCounts[RiskUnknown]) * WeightUnknown * adjuster

maxConfidence := WeightGreen * totalQuestions
score = int(confidence / float64(maxConfidence) * 100)

return
}

//
// PrepareForApplication prepares the sections of an assessment by including, excluding,
// or auto-answering questions based on a set of tags.
Expand Down
6 changes: 0 additions & 6 deletions assessment/section.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,5 @@
package assessment

//
// Assessment risk
const (
RiskUnknown = "unknown"
)

//
// Section represents a group of questions in a questionnaire.
type Section struct {
Expand Down
61 changes: 58 additions & 3 deletions auth/roles.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -42,11 +42,14 @@
- name: applications.stakeholders
verbs:
- put
- name: applications.assessments
verbs:
- get
- post
- name: assessments
verbs:
- delete
- get
- patch
- post
- put
- name: businessservices
Expand Down Expand Up @@ -185,6 +188,22 @@
- get
- post
- put
- name: archetypes
verbs:
- delete
- get
- post
- put
- name: archetypes.assessments
verbs:
- get
- post
- name: questionnaires
verbs:
- delete
- get
- post
- put
- role: tackle-architect
resources:
- name: addons
Expand Down Expand Up @@ -229,11 +248,14 @@
- name: applications.stakeholders
verbs:
- put
- name: applications.assessments
verbs:
- get
- post
- name: assessments
verbs:
- delete
- get
- patch
- post
- put
- name: businessservices
Expand Down Expand Up @@ -359,6 +381,16 @@
- get
- post
- put
- name: archetypes
verbs:
- get
- name: archetypes.assessments
verbs:
- get
- post
- name: questionnaires
verbs:
- get
- role: tackle-migrator
resources:
- name: addons
Expand All @@ -382,10 +414,12 @@
- name: applications.analyses
verbs:
- get
- name: applications.assessments
verbs:
- get
- name: assessments
verbs:
- get
- post
- name: businessservices
verbs:
- get
Expand Down Expand Up @@ -466,6 +500,15 @@
- name: analyses
verbs:
- get
- name: archetypes
verbs:
- get
- name: archetypes.assessments
verbs:
- get
- name: questionnaires
verbs:
- get
- role: tackle-project-manager
resources:
- name: addons
Expand All @@ -492,6 +535,9 @@
- name: applications.stakeholders
verbs:
- put
- name: applications.assessments
verbs:
- get
- name: assessments
verbs:
- get
Expand Down Expand Up @@ -567,3 +613,12 @@
- name: analyses
verbs:
- get
- name: archetypes
verbs:
- get
- name: archetypes.assessments
verbs:
- get
- name: questionnaires
verbs:
- get

0 comments on commit 6e7290a

Please sign in to comment.