Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Backend] 环境属性生效时间只支持周期 #432

Closed
wklken opened this issue Nov 24, 2021 · 17 comments
Closed

[Backend] 环境属性生效时间只支持周期 #432

wklken opened this issue Nov 24, 2021 · 17 comments
Assignees
Labels
Milestone

Comments

@wklken
Copy link
Collaborator

wklken commented Nov 24, 2021

  • 每天 08:00-10:00
  • 每周一三五 08:00-10:00
  • 每月第一天 08:00-10:00

重点关注:

  1. 时区问题, 配置/存储/鉴权
  2. 是否需要接入系统传递时间?

例如, 配置每天 08:00-10:00, 那么另外一个时区用户使用时, 对使用者来说其时间不一定是 08:00-10:00

锚定零时区?

@wklken wklken added this to the Y2021M47 milestone Nov 24, 2021
@wklken wklken self-assigned this Nov 24, 2021
@wklken wklken added this to To do in bk-iam 蓝鲸权限中心 via automation Nov 24, 2021
@wklken
Copy link
Collaborator Author

wklken commented Nov 24, 2021

@wklken
Copy link
Collaborator Author

wklken commented Nov 25, 2021

决策 1

配置后, 是相对的时间还是时区相关的时间

  1. 相对时间: 08:00 - 10:00, 接入系统部署在任意一个时区, 其用户在当地的08:00-10:00都能执行
  2. 绝对时间: 08:00 - 10:00 +08:00, 接入系统部署在任意一个时区, 其用户只有在东八区的08:00-10:00才能执行

相对时间是用户体验友好的, 但是不一定是配置方想要的

@wklken
Copy link
Collaborator Author

wklken commented Nov 26, 2021

只能是绝对时间, 谁在哪个时区配的, 就是这个时区的时间 => 所以保存的值, 可以统一转UTC 的小时分钟秒, 计算的时候统一以服务器获取 UTC 时间来做比较.

如果是相对时间, 可以无限切换时区获得权限;

@wklken
Copy link
Collaborator Author

wklken commented Nov 26, 2021

逻辑

saas => 字符串, 带时区; (展示时, 需要根据用户时区转换过去)


存: UTC => HHMMSS 080000 - 235959


算 ts => UTC => HHMMSS 比较


@wklken
Copy link
Collaborator Author

wklken commented Nov 26, 2021

  1. 注册操作需要改下支持
  2. 比较操作符需要支持

@wklken
Copy link
Collaborator Author

wklken commented Nov 26, 2021

#391


注意, 如果未来需要加入周期性限制, 例如周一到周五的 20:10 - 21:20, 那么通过以下方式扩展

current_weekday in [1 2 3 4 5]
current_seconds < X AND current_seconds > Y (从 00:00到当前的秒数)

暂时不考虑支持每月/每年;

周期性的就不是绝对时间戳, 会涉及时区问题, 会涉及需要接入系统传入, 如何处理/统一时区需要考虑


env.utc_hms > 080000 AND env.utc_hms < 220020

此时, 如果要配置 weekday in [1,2,3] OR monthday in [10, 11, 12] 怎么配置?

@wklken
Copy link
Collaborator Author

wklken commented Nov 26, 2021

tz = Asia/Shanghai    => tz=CST
hms > 080000
weekday= [1,2,3]
month = [7, 8]
monthday = [22, 23]

计算, current = time.Now().In(time.LoadLocation("Asia/Shanghai")) => current.weekday

default tz = "Asia/Shanghai", 即, 不配置, 默认都是Asia/Shanghai, 国际化, 用户前端配置的怎么处理? 不好转

这里只需要关注配置方的意图; 配置了哪个时区, 就是为了限制这个时区

https://timezonedb.com/time-zones/Asia/Shanghai

@wklken wklken modified the milestones: Y2021M47, Y2021M48 Nov 29, 2021
@wklken
Copy link
Collaborator Author

wklken commented Nov 29, 2021

统一根据用户时区转换成 utc时区? 或者Asia/Shanghai时区?

tz = Asia/Shanghai 
hms > 080000
weekday= [1,2,3]
month = [7, 8]
monthday = [22, 23]

结论: 存储配置者指定的时区, 计算时, 转到相应时区并完成计算. 这个对于所有方理解都能达成一致; 唯一的问题是, 存储上会比较长;

方案 1: 不做任何差异化, 通通设置tz=xx, 存储会变大 (倾向于)

  • 好处: 简单
  • 坏处: 这类策略存储变大, 但是应该可控

方案 2: 是否设置默认时区为 Asia/Shanghai

  • SaaS 侧, 当时区是Asia/Shanghai时, tz不存储;
  • 否则, 会存储 tz = xxxxx
  • 后台, 检测环境属性有没有指定时区, 没有的话, 默认Asia/Shanghai;
  • 计算时, 将ts => 转utc => 转目标时区, 后取 hms/weekday/month等作比较
  • 重要: 表达式吐出去的时候, 需要将时区加回去; (多一个默认时区And), 还有很多地方都需要做差异

执行时, 由于并不知道表达式里面有没有tz, 需要考虑如何处理? 运行时转?

@wklken wklken moved this from To do to In progress in bk-iam 蓝鲸权限中心 Nov 30, 2021
@wklken
Copy link
Collaborator Author

wklken commented Nov 30, 2021

k8s cronjob 关于 timezone的讨论:

文档: https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/#cron-job-limitations
对应的 CRD 实现: https://github.com/hiddeco/cronjobber


目前的实现还是依赖于服务器时间, 不支持timezone

@wklken
Copy link
Collaborator Author

wklken commented Nov 30, 2021

计算逻辑

  1. 检测表达式是否包含 {system_id}._bk_iam_env_
  2. 不是, 不生成 环境属性ctx
  3. 是, 获取{system_id}._bk_iam_env_.tz=A, 生成 环境属性ctx, ctx.tz=A, 并且ctx.hms=/ctx.weekday=x
    • 如果没有tz, 那么理论上不需要生成任何事件相关的属性
    • 未来, 需要填充request请求中传递过来的其他env条件

问题: 需要给每一条policy生成一个env, 因为不同的policy的tz可能不一样 => 用户+继承来的, 每条策略计算前都得生成放到ctx

@wklken
Copy link
Collaborator Author

wklken commented Dec 1, 2021

两个点:

  1. 存offset
  2. hms 转成 0 点开始的秒数

  1. 存offset, tz=Asia/Shanghai变成utc_offset=28800, 计算上没有本质区别; 但是后者在SaaS展示/理解等, 都需要经过一层转换 (存储上相对会大一些)
  2. hms存 0 点开始的描述, hms>080000 变更 s>28800, 计算及存储区别不大, 但是同上面一点, 不好理解(特别是时间是 60 进制)

结论:

第一期: 支持每天的 几点几分几秒 到 几点几分几秒

tz = Asia/Shanghai
AND
hms > 080000
AND
hms < 100000

未来, 支持每周/每月/每年的几月等

tz = Asia/Shanghai
AND
weekday in [1, 3 ,5]
AND
monthday in [30, 31]
AND
month in [11, 12]

@wklken
Copy link
Collaborator Author

wklken commented Dec 1, 2021

    someWhere, err := time.LoadLocation("Asia/Shanghai")
  

    t1 := time.Now().In(someWhere)
    fmt.Println(t1)

    fmt.Println(t1.Hour())
    fmt.Println(t1.Minute())
    fmt.Println(t1.Second())

    fmt.Println("hms:", 10000*t1.Hour()+100*t1.Minute()+t1.Second())

    fmt.Println(t1.Month(), int(t1.Month()))
    fmt.Println(t1.Day())

    fmt.Println(t1.Weekday(), int(t1.Weekday()))

    fmt.Println(t1.Year())
    fmt.Println(t1.YearDay())

@wklken
Copy link
Collaborator Author

wklken commented Dec 1, 2021

t := time.Now()

ctx := get_from_cache(t.Unix())

func get_from_cache(t int64, tz string) ctx {
    if cache.has(t, tz) {
        return cache.get(t)
    }
    return ctx {
        tz : tz,
       hms: hms,
       // later:
      weekday: 3,
      monthday: 1,
      year: 1
      month: 12,
     yearDay: 33,
   }


} 

@wklken
Copy link
Collaborator Author

wklken commented Dec 2, 2021

#391 / #392

@wklken
Copy link
Collaborator Author

wklken commented Dec 3, 2021

限制: 同一条策略, 只能存在一个时区!!!!!

@wklken wklken closed this as completed Dec 6, 2021
bk-iam 蓝鲸权限中心 automation moved this from In progress to Done Dec 6, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Development

No branches or pull requests

1 participant